XML document:
<doc>
<A>
<Node>Hello!</Node>
</A>
<B>
<Node/>
</B>
<C>
</C>
<D/>
</doc>
How would you evaluate the following XPath queries?
/doc/A/Node != 'abcd'
/doc/B/Node != 'abcd'
/doc/C/Node != 'abcd'
/doc/D/Node != 'abcd'
I would expect ALL of these to evaluate to true.
However, here are the results:
/doc/A/Node != 'abcd' true
/doc/B/Node != 'abcd' true
/doc/C/Node != 'abcd' false
/doc/D/Node != 'abcd' false
Is this expected behavior? Or is it a bug with my XPath provider (jaxen)?
Recommendation: Never use the !=
operator to compare inequality where one or both arguments are node-sets.
By definition the expression:
$node-set != $value
evaluates to true()
exactly when there is at least one node in $node-set
such that its string value is not equal to the string value of $value
.
Using this definition:
$empty-nodeset != $value
is always false()
, because there isn't even a single node in $empty-nodeset
for which the inequality holds.
Solution:
Use:
not($node-set = $value)
Then you get all results true()
, as wanted.