如果元素存在且非空,如何判断使用XPath?

Cha*_*ana 20 xml xpath mule

我在这一行上有一个输入XML:

<Holding id="12">
    <Policy>
        <HoldingForm tc="1">Individual</HoldingForm>
        <PolNumber>848433</PolNumber>
        <LineOfBusiness tc="1">Life</LineOfBusiness>
        <CarrierCode>67644</CarrierCode>
    </Policy>
</Holding>
Run Code Online (Sandbox Code Playgroud)

我对此XML的操作取决于if <PolNumber>(它是模式中的可选元素)是否具有值.我正在使用Mule 3.3 xpath求值程序执行此操作,我的XPath表达式看起来像这样:

<expression-filter expression="#[xpath('//acord:Holding/acord:Policy/acord:PolNumber').text != empty]"/> 
Run Code Online (Sandbox Code Playgroud)

只要<PolNumber>元素存在或者<PolNumber/>是空元素,这就可以正常工作.但如果<PolNumber>不存在,则上面的表达式抛出异常.

我试着用XPath的布尔函数,但返回true<PolNumber/>.有没有更好的方法来检查元素是否存在且非空?

编辑:

这是我的mule配置中命名空间管理器的配置

<xm:namespace-manager includeConfigNamespaces="true">
    <xm:namespace prefix="acord" uri="http://ACORD.org/Standards/Life/2" />
    <xm:namespace prefix="soap" uri="http://schemas.xmlsoap.org/soap/encoding/" />
</xm:namespace-manager>
Run Code Online (Sandbox Code Playgroud)

Dim*_*hev 26

用途:

boolean(//acord:Holding/acord:Policy/acord:PolNumber/text()[1])
Run Code Online (Sandbox Code Playgroud)

这会生成true()if //acord:Holding/acord:Policy/acord:PolNumber有第一个文本节点子节点,false()否则.

请注意:这比计算所有文本节点子节点只是为了将计数与0进行比较更有效.

  • @Learner,这是直截了当的:`boolean(// acord:Holding/acord:Policy/acord:PolNumber/text()[normalize-space()] [1])` (2认同)

Jen*_*rat 11

您可以使用boolean(...)它来检查它是否为空,但请务必查看元素内部.

boolean(//PolNumber/node())
Run Code Online (Sandbox Code Playgroud)

如果包含其他节点,这也适用.如果要限制文本节点,请替换node()text().您可能希望使用//text(),然后查询也将为其他子元素内的文本节点生成true <PolNumber/>.