XPath:如何选择以下兄弟姐妹直到某个兄弟姐妹

use*_*248 13 html xpath

对于下面的示例HTML,返回带有class ='B'的class ='A'的"a"元素的兄弟的XPath查询可以写成://a[@class='A']/following-sibling::a[@class='B'].此查询输出4个<a class="B"/>元素.

但是,我只想要<a class="B"/>跟随当前<a class="A"/>元素的元素,而不想跟随其他<a class="B"/>元素/节点的元素.换句话说,我只想要下面的<a class="B"/>兄弟元素,直到下一个<a class="B"/>元素出现.

示例HTML:

<a class='A' />
<a class='B' />
<a class='A' />
<a class='B' />
<a class='B' />
<a class='B' />
Run Code Online (Sandbox Code Playgroud)

关于如何将我当前的XPath查询限制为仅仅是那些兄弟姐妹的任何想法将非常感谢:)

Way*_*ett 11

要选择a具有某个特定值与等于的class属性B之间的所有元素以及下一个此类事件:aclassA

/*/a[@class='A'][$n]/following-sibling::a[
    @class='B' and count(preceding-sibling::a[@class='A'])=$n]
Run Code Online (Sandbox Code Playgroud)

这将选择第n个 a[@class='A']和下一个这样的元素之间的所有内容.有关具体示例,请考虑以下输入:

<r>
  <a class="A"/>  
  <a class="B"/>  
  <a class="A"/>  
  <a class="B"/>  
  <a class="B"/>  
  <a class="A"/>  
  <a class="B"/>  
  <a class="B"/>  
  <a class="B"/>
</r>
Run Code Online (Sandbox Code Playgroud)

要获得第二个<a class="A"/>和第三个之间的两个元素<a class="A"/>:

/*/a[@class='A'][2]/following-sibling::a[
    @class='B' and count(preceding-sibling::a[@class='A'])=2]
Run Code Online (Sandbox Code Playgroud)

在英语中,这说:

给我所有的a具有元素class,其值等于属性B落入本第二后a具有类属性等于A具有和仅具有两个前面的兄弟姐妹class等于属性A

类似地,更一般地,我们可以应用Kayessian方法来找到两个节点集的交集.在给出的示例中,我们希望@class='B'1)中所有元素的交集在第二个之后的兄弟姐妹集合<a class="A"/>和2)在第三个之前的兄弟姐妹集合<a class="A"/>.这两个集合的交集正好是这两个分隔元素之间的节点,可以这样表达:

/*/a[@class='A'][2]/following-sibling::a[@class='B'][
    count(.|/*/a[@class='A'][3]/preceding-sibling::a[@class='B'])=
    count(/*/a[@class='A'][3]/preceding-sibling::a[@class='B'])]
Run Code Online (Sandbox Code Playgroud)


har*_*r07 4

你可以尝试这样:

//a[
    @class='B' 
        and 
    preceding-sibling::a[@class='A'] 
        and 
    following-sibling::a[@class='A']
   ]
Run Code Online (Sandbox Code Playgroud)

上面的 XPath 将选择<a class='B'>两个元素之间的所有元素<a class='A'>