XPath—与x27之间的差异;不是';和'=';

XPath—与x27之间的差异;不是';和'=';,xpath,Xpath,只是一个关于xpath的“not”和“!=”之间区别的简单问题在下面的内容中 以XML为例: <years> <year value="2010"></year> <year value="2010"></year> <year value="2010"></year> <year value="2009"></year> </years> 以下仅返回2009

只是一个关于xpath的“not”和“!=”之间区别的简单问题在下面的内容中

以XML为例:

<years>
  <year value="2010"></year>
  <year value="2010"></year>
  <year value="2010"></year>
  <year value="2009"></year>
</years>
以下仅返回2009年节点

years/year[@value != preceding-sibling::year/@value]
它们之间的唯一区别是!=而不是操作员。我已经思考了一段时间,我找不到一个可以令人满意地向其他人解释的区别

也许有人能帮忙

干杯


Steve

我对xpath不在行,但我认为“not”重新定义了包含内容的倒转值和!=返回两个可比较对象之间的比较值

第二个示例不起作用,因为如果将其应用于前3个节点中的每一个,它将永远不匹配。对于第一个
,没有可以尝试比较其值的前一个同级,因此它无法匹配。对于第二个和第三个节点,它们前面的节点确实具有相同的值,因此非相等性测试失败并导致再次不匹配

not(…)
版本之所以有效,是因为在第一个节点中,由于缺少前一个同级节点,整个
@value=previous sibling::year/@value
都会失败,而这个失败会被
not
倒转,从而使您在第一个节点上找到匹配项。

在XPath中,
a!=b
非(a=b)
非常不同 原因如下 根据XPath 1.0规范:

如果要比较的两个对象都是 节点集,则将进行比较 当且仅当中存在节点时为true 中的第一个节点集和一个节点 第二个节点设置为 在 两个节点的字符串值为 对

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

在您的例子中,发生的情况是
(2010!=空集)
始终为false,而

not(2010=空集)
始终为真。考虑上面的匹配规则。

但“not(x=y)”肯定与“x!”相同是的。显然不是,但我不明白为什么。太棒了!!!这是一个完美的答案,而且非常简单。非常感谢-我今晚可以睡得很安稳,也许这对将来的其他人有帮助。我认为我没有足够的声望点数来投票支持你,但一旦我投票支持了你,我会的。干杯SteveHi Kyle谢谢你抽出时间。这是一个扩展的答案,但声明与上面的Max S.相同,这是非常棒的。
years/year[@value != preceding-sibling::year/@value]