如何使用Xquery返回具有名称空间的最后一个节点



我有这个文件,其中有名称空间,我正试图编写一个Xquery,它将返回,具有名称空间的最后一个节点,但无法找到返回名称空间节点的逻辑(PS:我是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>

我已经尝试了一个查询返回节点与确切的字符串值,但没有工作。

您可以查找文档//*中的所有元素,并测试谓词过滤器中是否存在namespace-uri(),然后选择具有namespace-uri()last()元素。

let $doc := 
<XML>
<bk:BOOK xmlns:bk="urn:example.microsoft.com:BookInfo" xmlns:money="urn:Finance:Money">
<bk:TITLE>value1</bk:TITLE>
<ONLINEBRE />
<bk:PRICE money:currency="US Dollar">22.95</bk:PRICE>
</bk:BOOK>
</XML>
return ($doc//*[namespace-uri()])[last()]

根据你对Mads Hansen的回答的评论,我想到了这个:

declare namespace array = "http://www.w3.org/2005/xpath-functions/array";
declare function local:ns-changed ($current as element(), $last-ns, $last-element) {
$current/element() ! (
let $child-ns := namespace-uri-from-QName(node-name(.))
return
if ( $child-ns = $last-ns )
then local:ns-changed(., $last-ns, $last-element)
else local:ns-changed(., $child-ns, .)
),
$last-element
};
let $root :=
<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>
let $initial-ns := namespace-uri-from-QName(node-name($root))
let $wanted := head(local:ns-changed($root, $initial-ns, $root))
return $wanted

我可能不漂亮,效率低下,也只测试你提供的输入,但它做你想要的。

在这里你可以看到它的作用https://xqueryfiddle.liberty-development.net/3Nzd8c9/1

目前它返回最后一个元素命名空间改变的地方。要返回节点名或值或其他内容,请修改最后一行。

相关内容

  • 没有找到相关文章

最新更新