首页 文章

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

提问于
浏览
0

鉴于测试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>

问题:如何选择其第一个前兄弟节点 are non-empty text nodes 的所有 b 元素?

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

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

元素 b_4 具有作为元素节点的第一个前一个兄弟节点 .


我尝试了以下内容,但它们都至少在一个方面失败了:

  • preceding-sibling::*[1] 将选择第一个元素节点,忽略所需的文本节点 .

  • preceding-sibling::text()[1] 将选择跳过任何元素节点的第一个文本节点 .

2 回答

  • -1

    这个XPath,

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

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

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

    按照要求 .

  • 2

    这应该工作:

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

    normalize-space 函数是检查那里存在某个东西的函数,因为 preceding-sibling 可能是空的,甚至只是 \n .

相关问题