XPath运算符"!=".它是如何工作的?

Kei*_*ith 31 xpath equals operator-keyword

XML文档:

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

    <B>     
        <Node/>
    </B>  

    <C>
    </C>

    <D/>
</doc>
Run Code Online (Sandbox Code Playgroud)

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

/doc/A/Node != 'abcd'  
/doc/B/Node != 'abcd'  
/doc/C/Node != 'abcd'  
/doc/D/Node != 'abcd'  
Run Code Online (Sandbox Code Playgroud)

我希望所有这些都能评估为.

但是,结果如下:

/doc/A/Node != 'abcd'     true
/doc/B/Node != 'abcd'     true
/doc/C/Node != 'abcd'     false
/doc/D/Node != 'abcd'     false
Run Code Online (Sandbox Code Playgroud)

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

Dim*_*hev 58

建议:切勿使用!=运算符来比较一个或两个参数是节点集的不等式.

根据定义,表达式:

$node-set != $value
Run Code Online (Sandbox Code Playgroud)

true()当至少有一个节点$node-set的字符串值不等于字符串值时,精确计算$value.

使用此定义:

$empty-nodeset != $value 
Run Code Online (Sandbox Code Playgroud)

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

方案:

用途:

not($node-set = $value)
Run Code Online (Sandbox Code Playgroud)

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


Gre*_*ill 2

来自XPath 规范

如果要比较的一个对象是节点集,另一个是字符串,则当且仅当节点集中存在一个节点使得对字符串值执行比较的结果时,比较才为真该节点和另一个字符串的值为 true。

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

您可以解决此行为并使用如下表达式获得您想要的结果:

count(/doc/C/Node) = 0 or /doc/C/Node != 'abcd'
Run Code Online (Sandbox Code Playgroud)