2013-04-09 138 views
14

我已经在这条线的输入XML的东西:如何判断一个元素是否存在而非空,使用XPath?

<Holding id="12"> 
    <Policy> 
     <HoldingForm tc="1">Individual</HoldingForm> 
     <PolNumber>848433</PolNumber> 
     <LineOfBusiness tc="1">Life</LineOfBusiness> 
     <CarrierCode>67644</CarrierCode> 
    </Policy> 
</Holding> 

我对这个XML操作取决于如果<PolNumber>(其架构中的可选元素)的值或没有。我使用的骡子3.3 xpath评估要做到这一点,我的XPath表达式如下这样:

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

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

我尝试使用XPath boolean函数,但它返回true<PolNumber/>。有没有更好的方法来检查一个元素是否存在且非空?

编辑:

这是命名空间管理在我的骡子配置配置

<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> 

回答

21

使用

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

这将产生true()如果//acord:Holding/acord:Policy/acord:PolNumber具有第一文本节点孩子,和false()否则。

请注意:这比计算所有的文本节点孩子刚与0

+0

我同意这样更好比计算所有文本节点的孩子,但即使这种解决方案不是完整的证明。这个xpath将返回为''。我不知道如何在评论中显示新行,但是我的意图是在''和'' – 2013-04-10 16:39:04

+2

@Learner之间有新的行字符,这是直接的:'boolean(// acord:Holding/acord :Policy/acord:PolNumber/text()[normalize-space()] [1])' – 2013-04-10 17:22:07

+1

谢谢Dimitre。我没有用xpath进行曝光,所有这些都对我非常有帮助。 – 2013-04-10 18:07:23

1

有关使用count获得文本节点的数量是什么:

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

感谢您的回复。 '没有这样的功能{org.jaxen.SimpleFunctionContext:127'异常是抛出计数功能{0}。 – 2013-04-09 18:31:16

+0

我把上面的表达式改成了''然后这个工作,但是,''计数是非零,就像'boolean'函数 – 2013-04-09 18:43:44

+0

奇怪你必须用'fn'作为前缀编辑你的问题并显示如何配置你的名字空间管理器。 – 2013-04-09 18:43:46

8

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

boolean(//PolNumber/node()) 

这也适用于包含其他节点的情况。如果要限制为文本节点,请将node()替换为text()。您可能想要使用//text()来代替,那么查询也会在<PolNumber/>的其他子元素内的文本节点上生成true。

2

如何expression="#[?xpath('//acord:Holding/acord:Policy/acord:PolNumber').text != empty]"比较计数更有效率?这应该在所有情况下工作

0

也许我在这里有点晚,但答案有点混乱。 当文字为空或空格但没有字符时,这一个将始终返回false。

boolean//Holding/Policy/PolNumber/child/text()[normalize-space()] 
相关问题