XPath运算符“!=”。它是如何工作的?

时间:2011-01-07 19:23:43

标签: xpath equals operator-keyword

XML文档:

<doc>
    <A>   
        <Node>Hello!</Node>   
    </A> 

    <B>     
        <Node/>
    </B>  

    <C>
    </C>

    <D/>
</doc>

您将如何评估以下XPath查询?

/doc/A/Node != 'abcd'  
/doc/B/Node != 'abcd'  
/doc/C/Node != 'abcd'  
/doc/D/Node != 'abcd'  

我希望这些 ALL 评估为 true

但是,结果如下:

/doc/A/Node != 'abcd'     true
/doc/B/Node != 'abcd'     true
/doc/C/Node != 'abcd'     false
/doc/D/Node != 'abcd'     false

这是预期的行为吗?或者它是我的XPath提供程序(jaxen)的错误?

2 个答案:

答案 0 :(得分:55)

推荐:永远不要使用!=运算符来比较一个或两个参数是节点集的不等式。

By definition表达

$node-set != $value
true()中至少有一个节点使其字符串值不等于$node-set的字符串值时,

准确评估$value

使用此定义

$empty-nodeset != $value 

总是false(),因为$empty-nodeset中甚至没有一个节点存在不等式。

<强>解决方案

使用

not($node-set = $value)

然后根据需要获得所有结果true()

答案 1 :(得分:1)

来自XPath spec

  

如果要比较的一个对象是节点集而另一个是字符串,那么当且仅当节点集中有一个节点使得执行比较的结果时,比较才为真。节点的字符串值和另一个字符串为真。

这意味着如果节点集为空(如在C和D情况下),则布尔表达式的结果将为false,因为不存在可应用不等式的节点。

您可以使用以下表达式解决此问题并获得所需的结果:

count(/doc/C/Node) = 0 or /doc/C/Node != 'abcd'