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

时间:2014-05-25 23:21:38

标签: html xpath

对于下面的示例HTML,一个XPath查询返回&#34; a&#34;的兄弟姐妹。 class =&#39; A&#39;有班级=&#39; B&#39;可以写成://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' />

如何将我当前的XPath查询限制为这些兄弟姐妹的任何想法都将非常感激:)

3 个答案:

答案 0 :(得分:10)

要选择具有a属性class属性B之间a属性的所有class元素,其中某个特定A/*/a[@class='A'][$n]/following-sibling::a[ @class='B' and count(preceding-sibling::a[@class='A'])=$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>

这将选择 nth <a class="A"/>与下一个此类元素之间的所有内容。有关具体示例,请考虑以下输入:

<a class="A"/>

要在第二个/*/a[@class='A'][2]/following-sibling::a[ @class='B' and count(preceding-sibling::a[@class='A'])=2] 和第三个a之间获取两个元素:

class

在英语中,这说:

  

向我提供具有B属性的所有a元素,其值等于A,其后面的第class类属性等于{{ 1}}并且只有两个兄弟姐妹的A属性等于@class='B'

类似地,更一般地,我们可以应用Kayessian方法来查找两个节点集的交集。在给出的示例中,我们希望1)中的所有<a class="A"/>元素与第二个<a class="A"/>之后的兄弟姐妹的集合和2)第三个/*/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'])] 之前的兄弟集合的交集。这两个集合的交集正好是这两个分频器元素之间的节点,可以这样表达:

{{1}}

答案 1 :(得分:2)

您可以尝试这种方式:

//a[
    @class='B' 
        and 
    preceding-sibling::a[@class='A'] 
        and 
    following-sibling::a[@class='A']
   ]

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

答案 2 :(得分:-1)

以这种方式尝试:

//a[@class='B'][preceding-sibling::*[1][name()='a'][@class='A']]