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)的错误?
答案 0 :(得分:55)
推荐:永远不要使用!=
运算符来比较一个或两个参数是节点集的不等式。
$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'