【问题标题】:XPath - Difference between 'not' and '!='XPath - 'not' 和 '!=' 之间的区别
【发布时间】:2010-02-16 15:15:15
【问题描述】:

关于以下内容中 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]

它们之间的唯一区别是 != 而不是运算符。我已经思考了一段时间,但找不到任何可以令人满意地向其他人解释的区别。

也许有人可以帮忙。

干杯

史蒂夫

【问题讨论】:

    标签: xpath


    【解决方案1】:

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

    not(...) 版本有效,因为在第一个节点中,整个 @value = preceding-sibling::year/@value 由于缺少前面的兄弟而失败,并且此失败由 not 反转,在第一个节点上为您提供匹配。

    【讨论】:

    • 太棒了!!!这是完美的答案,而且如此简单。非常感谢 - 我今晚可以睡得安稳了,也许这对将来的其他人有帮助。我认为我没有足够的声望点来投票给你,但一旦我这样做了,我会的。干杯史蒂夫
    【解决方案2】:

    在 XPath 中,a != bnot(a = b) 非常不同

    原因如下

    来自 XPath 1.0 的规范:

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

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

    在您的情况下,(2010 != empty set) 始终为假,而
    not (2010 = empty set) 始终为真。想想上面的匹配规则。

    【讨论】:

    • 嗨凯尔,感谢您抽出宝贵的时间。这是一个扩展的答案,但与上面的 Max S. 相同,非常棒。
    【解决方案3】:

    我不是 xpath 的专业人士,但我认为 'not' 会返回包含事物的反转值,而 != 返回两个可比较事物之间的比较值

    【讨论】:

    • 但肯定 'not(x = y)' 与 'x != y' 相同。显然不是,但我不明白为什么。
    猜你喜欢
    • 2021-01-08
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 2022-11-25
    相关资源
    最近更新 更多