2010-02-16 48 views
6

只是一个关于xpath的'not'和'!='在以下内容中的区别的简单问题。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] 

它们之间唯一的区别是!=,而不是运营商。我思考了这一段时间,我找不到能够令人满意地向其他人解释的区别。

也许有人可以帮忙。

干杯

史蒂夫

回答

8

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

not(...)版本的作品,因为在第一个节点,整个@value = preceding-sibling::year/@value失败是由于缺乏前面的兄弟,而这个失败的not倒,给你的第一个节点上的匹配。

+0

太棒了!这是一个完美的答案,非常简单。非常感谢 - 今晚我可以轻松入睡,也许这会在未来帮助其他人。我认为我没有足够的声望点给你投票,但是我会一次。 干杯 史蒂夫 –

0

我是对的XPath无亲,但我认为“不” retunrns的含事情的反转值和!=返回两个compareable事物之间的比较值

+0

但肯定'not(x = y)'与'x!= y'是一样的。显然这不是,但我不明白为什么。 –

8

在XPath,a != bnot(a = b)有很大的不同

这也是为什么

从规范了用于XPath 1.0:

如果要比较两个对象都是 节点集,那么比较将是 当且仅当存在在 一个节点的第一个节点集和节点在 第二节点集,使得结果 执行 两个节点的字符串值的比较为 为true。

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

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

+0

嗨凯尔, 感谢您抽出时间。这是一个扩展的答案,但是与上面的Max S.一样,这很棒。 –