鉴于此:
<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的理解告诉我这应该有用吗?
答案 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
轴。