XPath follow-sibling无法正常工作

时间:2017-09-08 16:54:15

标签: xml xpath

鉴于此:

<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的理解告诉我这应该有用吗?

1 个答案:

答案 0 :(得分:1)

这个XPath,

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

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

回应评论中的后续问题:

  

从w3schools,/表示我们正在寻找孩子们   上一个节点,所以a / after summary对我来说意味着我们正在寻找   总结的孩子,没有什么......为什么?

     

哦,我明白了 - 如果你在/之后使用一个轴,那么意思就不是   一定是孩子了;这是轴指定的任何东西,比如   以下同胞。

是的,您最初的混淆源于XPath中/的含义。

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