XPath - 'not'和'!='之间的区别

时间:2010-02-16 15:15:15

标签: xpath

以下内容中xpath的'not'和'!='之间的差异只是一个简单的问题。

采用XML:

<years>
  <year value="2010"></year>
  <year value="2010"></year>
  <year value="2010"></year>
  <year value="2009"></year>
</years>

我想选择独特的年份。我已经挣扎了一段时间才能实现这一目标,但最后还是以一种奇怪的方式进行了管理,这是我没想到的。

以下xpath对我的意图是正确的,并返回2009年和2010年的两个唯一年节点。

years/year[not(@value = preceding-sibling::year/@value)]

以下仅返回2009年节点。

years/year[@value != preceding-sibling::year/@value]

它们之间唯一的区别是!=而不是运算符。我已经思考了一段时间,我找不到可以令人满意地向其他人解释的差异。

也许有人可以提供帮助。

干杯

史蒂夫

3 个答案:

答案 0 :(得分:8)

第二个示例不起作用,因为如果将它应用于前3个节点中的每个节点,它永远不会匹配。对于第一个<year>,没有先前的兄弟,其值可能会尝试与之比较,因此无法匹配。对于第二个和第三个,它们的前一个节点具有相同的值,因此不相等测试失败并导致不再匹配。

not(...)版本有效,因为在第一个节点中,整个@value = preceding-sibling::year/@value由于缺少前一个兄弟而失败,而这个失败被not反转,给你一个匹配在第一个节点上。

答案 1 :(得分:8)

在XPath中,a != bnot(a = b)非常不同

这就是为什么

来自XPath 1.0的规范:

  

如果要比较的两个对象都是   节点集,然后进行比较   当且仅当有节点时才返回true   第一个节点集和一个节点   第二个节点设置使得结果   对...进行比较   两个节点的字符串值是   真。

这意味着如果a和b中的任何元素之间存在匹配,则节点集的(a = b)为真。
(a!= b)表示DOES中的某些元素与b中的某个元素不匹配。所以对于节点集A =(1,2),B =(1,2)。同时a = b和a!= b将返回true。

在你的情况下,发生的事情是(2010 != empty set)总是假的,而
not (2010 = empty set)总是如此。考虑上面的匹配规则。

答案 2 :(得分:0)

我在xpath上不是专业人士,但我认为'not'重新计算包含事物的反转值,而!=返回两个可比较事物之间的比较值