[xpath]获取兄弟姐妹,直到出现类


<div>
    <div class="header">
        <p>name 1</p>
    </div>
    <div class="content">czx</div>
    <div class="content">dsczx</div>
    <div class="content">czsadx</div>
    <div class="content">cz34x</div>
    <div class="content">4czewtwex</div>
    <div class="header">
        <p>name 2</p>
    </div>
    <div class="content">czx</div>
    <div class="content">czsadx</div>
    <div class="content">cz34x</div>
    <div class="content">4czewtwex</div>
    <div class="header">
        <p>name 3</p>
    </div>
    <div class="content">czx</div>
    <div class="content">czsadx</div>
    <div class="content">cz34x</div>
    <div class="content">4czewtwex</div>
</div>

嗨,伙计们!我有一个这样的有问题的结构。我想创建一个 xpath,它将<div>获取给定<p>具有类"内容"下面的所有元素,但如果有任何其他元素带有类"header",则"header"下面的元素将被省略。

//div/p[text() = 'name 1']/../following-sibling::div[@class = 'content']

对于//div/p[text() = 'name 1']/../following-sibling::div[@class = 'content']输出应为:

<div class="content">czx</div>
<div class="content">dsczx</div>
<div class="content">czsadx</div>
<div class="content">cz34x</div>
<div class="content">4czewtwex</div>

对于//div/p[text() = 'name 2']/../following-sibling::div[@class = 'content']输出应为:

<div class="content">czx</div>
<div class="content">czsadx</div>
<div class="content">cz34x</div>
<div class="content">4czewtwex</div>

对于//div/p[text() = 'name 3']/../following-sibling::div[@class = 'content']输出应为:

<div class="content">czx</div>
<div class="content">czsadx</div>
<div class="content">cz34x</div>
<div class="content">4czewtwex</div>

它有点复杂(我相信可以做得更好(。请注意,"名称 X"在 3 处使用(您还需要替换它 3 次(。

  1. 将所有元素从底部到"名称 3">
/div

/div[preceding-sibling::d iv/p='name 3']

  1. 给出子列表中的元素总数

count(/div/div[preceding-sibling::d iv/p='name 3'](

  1. 返回带有类标头的 DIV 的第一个位置,如果未找到,则返回 0。

count(/div/div[preceding-sibling::d iv/p='name 3'][@class='header']/follow::d iv(

  1. 现在我们有一个列表,其中的元素总数,以及第一个带有类 Header 的 DIV 的位置(否则为 0(。现在我们可以计算我们真正需要多少职位

子列表的总数减去要删除的元素数 从列表中。

xPath (wokring solution(:

/div/div[preceding-sibling::div/p='name 3'][position()<count(/div/div[preceding-sibling::div/p='name 3'])+1-count(/div/div[preceding-sibling::div/p='name 3'][@class='header']/following::div)][@class='content']

最新更新