对于下面的示例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
之间的所有元素以及下一个此类事件:a
class
A
/*/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)
你可以尝试这样:
//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'>
。