对于下面的示例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)
你可以尝试这样:
//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'>。
| 归档时间: |
|
| 查看次数: |
9390 次 |
| 最近记录: |