XPath选择另一个元素附近(之前和之后)的标签?

时间:2016-09-15 20:59:06

标签: html xml xpath

可以使用XPath选择br元素之前和之后的所有h3标记吗?

这仅选择第一个br标记://h3/following-sibling::*[1][name()='br']

以下是代码段,我想选择之前的2个br代码和br代码后的2个h3代码:

<br />22111 Hamburg<br />(U- und Busbahnhof Billstedt)<br /><br /><h3>Wir treffen uns</h3><br /><br />um Erfahrungen auszutauschen...

1 个答案:

答案 0 :(得分:4)

备注:

  1. 你可能并不是指所有 h3元素,而是一个 特别是h3元素。
  2. [1]仅导致选择下一个兄弟姐妹。
  3. 而不是*[name()='br'],请使用br
  4. 请确保您的意思是following-sibling,而不是following
  5. 然后是这个XPath,

    //h3[.='Heading']/following-sibling::br
    

    会选择所有br元素为h3元素的兄弟元素,其字符串值为Heading

    更新

    对于此HTML,

    <div>
       <br/>22111 Hamburg<br/>
       (U- und Busbahnhof Billstedt)
       <br/><br/>
       <h3>Wir treffen uns</h3>
       <br/><br/>
       um Erfahrungen auszutauschen...
       <br/>abc<br/>
    </div>
    

    此XPath将在目标br之前立即选择两个h3兄弟元素,

    //h3[.='Wir treffen uns']/preceding-sibling::br[position() < 3]
    

    此XPath将在目标br之后立即选择两个h3兄弟元素,

    //h3[.='Wir treffen uns']/following-sibling::br[position() < 3]
    

    如果你想同时抓住所有4个,你可以通过|之前的之后的 XPath表达式结合起来:

    //h3[.='Wir treffen uns']/preceding-sibling::br[position() < 3]
    |
    //h3[.='Wir treffen uns']/following-sibling::br[position() < 3]
    

    更新2

    如果您希望数字范围包括所有节点,而不仅仅是br元素,则在计数时,请使用此XPath:

    //h3[.='Wir treffen uns']/preceding-sibling::node()[position() < 3][self::br]
    |
    //h3[.='Wir treffen uns']/following-sibling::node()[position() < 3][self::br]
    

    首先测试node()位置,然后通过br确保范围内的那些节点是[self::br]元素。请注意,所有文本节点都将计数,即使只包含空格。