【问题标题】:XPath OR operator for different nodes不同节点的 XPath OR 运算符
【发布时间】:2011-07-18 01:33:24
【问题描述】:

如何使用 XPath:

//bookstore/book/title or //bookstore/city/zipcode/title

只有//title 不行,因为我也有//bookstore/magazine/title

附言我看到了很多例子,但主要是属性或单节点结构。

【问题讨论】:

  • OR 包含双方。您正在寻找的是 XOR 运算符。您将 OR 一词的英语用法与逻辑运算符混为一谈。
  • 在这种情况下,使用 orxor 没有区别,因为不可能同时匹配两边。

标签: xpath


【解决方案1】:

zipcodebook 节点为父节点的所有title 节点:

版本 1:

//title[parent::zipcode|parent::book]

版本 2:

//bookstore/book/title|//bookstore/city/zipcode/title

第 3 版:(结果根据源数据排序,而不是按书籍顺序和邮政编码排序)

//title[../../../*[book or magazine] or ../../../../*[city/zipcode]]

or - 在 true/false 中使用 - xpath 中的布尔运算符

| - xpath 中的联合运算符运算符右侧的查询附加到左侧查询的结果集。

【讨论】:

  • "|"在 XPath 中并不是真正的“OR 运算符”。它允许您构建由整个 XML 树的子树组成的节点集。 “//book|//cd”表示在所有子节点和根节点的后代中找到所有名为“book”的节点,然后也找到所有名为“cd”的节点。如果在根节点的后代中只有书节点,则您的节点集将仅包含书节点。如果在根节点的后代中只有 cd 节点,则您的节点集将仅包含 cd 节点。如果在根节点的后代中同时存在 book 和 cd 节点,则您的节点集将同时包含 book 和 cd 节点。
  • 是的,我明白什么是“|”运营商是。我最初的问题是关于 OR 运算符。因此,如果有书籍和 cd,它只会找到书籍,如果没有书籍,但只有 cd,它会找到 cd。
  • @user569008: |union set operator
  • 那么,我的问题没有答案/节点的 XPath 中没有 OR 运算符?
  • 逻辑运算符(OR、XOR、AND)在每种编程语言中都是相同的,但自然语言对它们的解释略有不同。在讨论与其相关的问题时,最好消除歧义。此外,对于 XPath,最好不要将您的结果视为a 或 b,而是可以由 a 或 b。逻辑or 表示它可以通过a or b or both 定位。 Logical xor (eXclusive OR) 表示它可以通过either a or b, but not both 定位。逻辑and 表示它可以通过both a and b 定位。
【解决方案2】:

如果您只想选择具有联合运算符的两个节点之一,您可以使用此解决方案: (//bookstore/book/title | //bookstore/city/zipcode/title)[1]

【讨论】:

  • 真的()[1] 意味着只选择两者之一?!?!
  • @Anthony 是的,如果两个节点都存在,它将选择两者之一,否则它将选择唯一存在的一个。
  • 好吧,我误解了你的说法。它像任何其他“或”运算符一样操作,因此如果第一个条件返回 true,则第二个条件被绕过,是吗?
  • @Anthony 没有。这里没有条件。有节点。和“|” - 是节点联合运算符。它从指定路径创建节点集,并且不保证节点顺序。如果具有指定路径的节点不存在,则它只是在节点集中丢失。然后,“[1]”构造从节点集中获取第一个节点。
  • @Anthony 整个构造“(path1 | path2)[1]”在某些编程语言中就像一个 or 运算符 - 它会返回第一个找到的节点(不一定是来自 path1 的节点)。
【解决方案3】:

它的元素有两个xpath。然后你可以像下面这样写两个xpath:

xpath1 | xpath2

例如:

//input[@name="username"] | //input[@id="wm_login-username"]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-23
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 2016-05-31
    • 1970-01-01
    相关资源
    最近更新 更多