You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 02:40:33