对于下面的示例HTML,一个XPath查询返回" a"的兄弟姐妹。 class =' A'有班级=' B'可以写成://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查询限制为这些兄弟姐妹的任何想法都将非常感激:)
答案 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']]