如何使用XQuery返回最后一个带命名空间的节点?
问题
作为XQuery新手,我有一个包含命名空间的XML文件,想编写XQuery返回最后一个带有命名空间的节点,但找不到实现逻辑。我曾尝试按精确字符串值查询节点,但没能成功。
XML文件内容如下:
<XML> <SOAPMessage> <soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Body> <postRequestResponse xmlns="http://company.com"> <postRequestReturn> <OnlineBRE xmlns=""> <Proccode>NUM</Proccode> </OnlineBRE> </postRequestReturn> </postRequestResponse> </soapenv:Body> </soapenv:Envelope> </SOAPMessage> </XML>
解决方案
要实现需求,需先明确你要找的节点类型,对应两种场景:
场景1:找最后一个带有非空命名空间的节点(含继承父节点命名空间的节点)
XML中子节点默认继承父节点的命名空间,除非显式声明空命名空间。这类节点的判断依据是namespace-uri()返回值非空。
XQuery代码:
// 声明XML中用到的命名空间,可选,用于避免查询时的命名空间冲突 declare namespace soapenv = "http://schemas.xmlsoap.org/soap/envelope/"; declare namespace company = "http://company.com"; // 筛选所有非空命名空间的节点,再取最后一个 (//*[namespace-uri() != ""])[last()]
执行后会返回<postRequestReturn>节点——它继承了父节点的http://company.com命名空间,是整个XML树中最后一个符合条件的节点。
场景2:找最后一个显式声明非空命名空间的节点(自身带有xmlns属性且值非空)
如果需求是找自身显式定义了非空命名空间的节点,筛选逻辑改为判断节点是否有非空的xmlns属性:
XQuery代码:
(//*[@xmlns and @xmlns != ""])[last()]
执行后会返回<postRequestResponse xmlns="http://company.com">...</postRequestResponse>,它是最后一个显式声明非空命名空间的节点。
内容的提问来源于stack exchange,提问作者Adarsh Singh
相关产品推荐
相关产品推荐

