21

我在这一行有一个输入 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.3xpath求值器来执行此操作,我的 XPath 表达式如下所示:

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

只要<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>
4

5 回答 5

29

使用

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

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

请注意:这比仅将计数与 0 进行比较来计算所有文本节点子节点更有效。

于 2013-04-10T02:38:46.623 回答
13

您可以boolean(...)用于检查它是否为空,但请确保查看元素内部。

boolean(//PolNumber/node())

如果包含其他节点,这也适用。如果要限制为文本节点,请替换node()text(). 您可以改为使用//text(),然后查询也将为<PolNumber/>.

于 2013-04-09T20:47:59.703 回答
2

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

于 2014-09-17T18:19:16.230 回答
2

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

boolean//Holding/Policy/PolNumber/child/text()[normalize-space()]
于 2015-10-01T07:39:35.907 回答
1

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

<expression-filter
    expression="#[xpath('count(//Holding/Policy/PolNumber/child::text())') != 0]"/>
于 2013-04-09T18:11:30.220 回答