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

时间:2013-04-09 18:08:47

标签: 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>

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

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

只要<PolNumber>元素存在或<PolNumber/>为空元素,这就可以正常工作。但如果<PolNumber>不存在,则上面的表达式会引发异常。

我尝试使用XPath boolean函数,但它会为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>

5 个答案:

答案 0 :(得分:25)

使用

boolean(//acord:Holding/acord:Policy/acord:PolNumber/text()[1])

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

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

答案 1 :(得分:10)

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

boolean(//PolNumber/node())

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

答案 2 :(得分:2)

expression="#[?xpath('//acord:Holding/acord:Policy/acord:PolNumber').text != empty]"怎么样?这应该适用于所有情况

答案 3 :(得分:1)

如何使用count获取文本节点的数量:

<expression-filter
    expression="#[xpath('count(//Holding/Policy/PolNumber/child::text())') != 0]"/>

答案 4 :(得分:0)

也许我在这里有点晚了,但答案有点令人困惑。 当文本为空或带空格但没有字符时,这个将始终返回false。

boolean//Holding/Policy/PolNumber/child/text()[normalize-space()]