//parent::* 在 XPath 中?

//parent::* in XPath?

考虑这个简单的例子

library(xml2)

x <- read_xml("<body>
  <p>Some <b>text</b>.</p>
  <p>Some <b>other</b> <b>text</b>.</p>
  <p>No bold here!</p>
</body>")

现在,我想找到包含字符串 other 的节点的所有父节点 为此,我 运行

> xml_find_all(x, "//b[contains(.,'other')]//parent::*")

{xml_nodeset (2)}
[1] <p>Some <b>other</b> <b>text</b>.</p>
[2] <b>other</b>

我不明白为什么我也得到 <b>other</b> 元素。在我看来只有一个父节点,也就是第一个节点。

这是一个错误吗?

改变

//b[contains(.,'other')]//parent::*

which selects descendant-or-self(你不想要 self)和 parent,到

//b[contains(.,'other')]/parent::*

其中 select 纯粹沿着 parent,从 select 离子中消除 <b>other</b>

或者,更好的是,使用这个 XPath:

//p[b[contains(.,'other')]]

如果您想要 select 所有具有 b child 且 string-value 包含 "other" 子字符串的 p 元素,或者

//p[b = 'other']

如果 b 的 string-value 应该 等于 other。另见