在XPath中检索具有previous-sibling非空文本节点的元素

时间:2018-01-05 19:28:51

标签: html xml xpath

给出测试html:

<html>
<body>
  abc
  <b id="b_1">def</b>
  ghi
  <b id="b_2">jkl</b>
  <b id="b_3">mno</b><b id="b_4">qrs</b>
</body>
</html>

问题:如何选择其第一个兄弟节点为非空文本节点的所有b元素?

因此,在上面的示例中,我希望选择元素b_1b_2

元素b_3具有文本类型的第一个前一个兄弟节点,但它是空的。

元素b_4具有第一个前面的兄弟节点,即元素节点。

我尝试了以下方法,但他们都至少在一方面失败了:

  • preceding-sibling::*[1]将选择第一个元素节点,忽略所需的文本节点。
  • preceding-sibling::text()[1]将选择跳过任何元素节点的第一个文本节点。

2 个答案:

答案 0 :(得分:2)

这个XPath,

//b[preceding-sibling::node()[1][self::text()][.!='']]

将选择其前一个兄弟是非空文本节点的所有b个元素:

<b id="b_1">def</b>
<b id="b_2">jkl</b>

按要求。

答案 1 :(得分:-1)

这个应该有效:

//b[normalize-space(./preceding-sibling::text()[1])]

normalize-space函数检查那里存在的内容,因为preceding-sibling可能为空,甚至只有\n