【问题标题】:XPath following-sibling not workingXPath 跟随兄弟不起作用
【发布时间】:2017-09-08 16:54:14
【问题描述】:

鉴于此:

<details>
  <summary>1</summary>
  <from>2</from>
  <heading>WHAT YOU WANT</heading>
  <body>No not this</body>
</details>

我试图通过首先在摘要中找到匹配的“1”,然后在 from 中找到“2”,最后在一个带“2”。 (只需将要求检查 1 和 2 的条件视为理所当然 - 这是一个更大问题的简化示例。)

我试过了,但它只匹配“来自 2 的节点”:

//details[summary[text()="1"]]//following-sibling::*[contains(text(), "2")]

即使我对 https://www.w3schools.com/xml/xpath_axes.asp 的理解告诉我这应该有效?

【问题讨论】:

    标签: xml xpath


    【解决方案1】:

    这个 XPath,

    //details[1]/summary[.='1']
                /following-sibling::from[.='2']
                /following-sibling::heading
    

    将选择 from 元素之后的 from 元素,其字符串值等于 2 之后的 summary 元素,其字符串值等于 1,都包含在文档中的第一个 details 元素中。


    回答cmets中的后续问题:

    在 w3schools 中,/ 表示我们正在寻找 前一个节点,所以总结后的 / 对我来说意味着我们正在寻找 在摘要的孩子身上,没有任何东西......为什么?

    哦,我明白了 - 如果您在 / 之后使用轴,则含义不是 一定是孩子了;它是轴指定的任何内容,例如 跟随兄弟姐妹。

    对,您最初的困惑源于 XPath 中 / 的含义。

    / 分隔 location steps。定位步骤由轴、节点测试和零个或多个谓词组成。默认轴是child,但也可以使用其他轴。在上面的 XPath 中,使用了following-sibling 轴。

    【讨论】:

    • 如果在 和 之间存在间隙且其他节点数未知怎么办? ...实际上,没关系,这仍然有效。
    • 感谢您的回答-您能补充一点解释吗?在 w3schools 中,/ 表示我们正在寻找前一个节点的子节点,所以摘要之后的 / 对我来说意味着我们正在寻找摘要的子节点,其中没有任何内容......为什么?跨度>
    • 哦,我明白了 - 如果您在 / 之后使用轴,则含义不再是孩子;它是轴指定的任何内容,例如跟随兄弟。
    猜你喜欢
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多