关于xpath的'not'和'!='在以下内容中的区别,只是一个简单的问题.
采用XML:
<years>
<year value="2010"></year>
<year value="2010"></year>
<year value="2010"></year>
<year value="2009"></year>
</years>
Run Code Online (Sandbox Code Playgroud)
我想选择独特的年份.我已经挣扎了一段时间才能实现这一目标,但最终还是得到了管理,但这种奇怪的方式让我没想到.
以下xpath对我的意图是正确的,并返回2009年和2010年的两个独特年节点.
years/year[not(@value = preceding-sibling::year/@value)]
Run Code Online (Sandbox Code Playgroud)
以下仅返回2009年节点.
years/year[@value != preceding-sibling::year/@value]
Run Code Online (Sandbox Code Playgroud)
它们之间唯一的区别是!=而不是运算符.我已经思考了一段时间,我找不到可以令人满意地向其他人解释的差异.
也许有人可以帮忙.
干杯
史蒂夫
第二个示例不起作用,因为如果将它应用于前3个节点中的每个节点,它永远不会匹配.对于第一个<year>,没有先前的兄弟,其值可能会尝试与之比较,因此无法匹配.对于第二个和第三个,它们的前一个节点具有相同的值,因此不相等测试失败并导致不再匹配.
该not(...)版本有效,因为在第一个节点中,@value = preceding-sibling::year/@value由于缺少前面的兄弟节点而导致整体失败,并且这个故障被倒置not,在第一个节点上给出了匹配.
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)总是如此.考虑上面的匹配规则.
| 归档时间: |
|
| 查看次数: |
3054 次 |
| 最近记录: |