繁体   English   中英

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

[英]XPath - Difference between 'not' and '!='

关于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个节点中的每个节点,它永远不会匹配。 对于第一个<year> ,没有先前的兄弟,其值可能会尝试与之比较,因此无法匹配。 对于第二个和第三个,它们的前一个节点具有相同的值,因此不相等测试失败并导致不再匹配。

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

在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)始终为真。 考虑上面的匹配规则。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM