以下内容中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]
它们之间唯一的区别是!=而不是运算符。我已经思考了一段时间,我找不到可以令人满意地向其他人解释的差异。
也许有人可以提供帮助。
干杯
史蒂夫
答案 0 :(得分:8)
第二个示例不起作用,因为如果将它应用于前3个节点中的每个节点,它永远不会匹配。对于第一个<year>
,没有先前的兄弟,其值可能会尝试与之比较,因此无法匹配。对于第二个和第三个,它们的前一个节点具有相同的值,因此不相等测试失败并导致不再匹配。
not(...)
版本有效,因为在第一个节点中,整个@value = preceding-sibling::year/@value
由于缺少前一个兄弟而失败,而这个失败被not
反转,给你一个匹配在第一个节点上。
答案 1 :(得分:8)
a != b
和not(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'重新计算包含事物的反转值,而!=返回两个可比较事物之间的比较值