我对必须具备的基本知识感到困惑,以前的问题(和文档)并没有真正的帮助。
说我们有这6个兄弟姐妹:
<a_tag>... a1 ...</a_tag>
<b_tag>... b1 ...</b_tag>
<a_tag>... a2 ...</a_tag>
<b_tag>... b2 ...</b_tag>
<a_tag>... a3 ...</a_tag>
<b_tag>... b3 ...</b_tag>
一些xpath表达式可以正常工作。例如,//a_tag
选择全部3个a_tags
; //a_tag[2]
仅选择a2
。
再次使用//a_tag[following-sibling::b_tag]
选择全部3 a_tags
。
//a_tag[following-sibling::b_tag[2]]
有点夸张,正确选择了a1
和a2
。但是,使用//a_tag[following-sibling::b_tag[3]]
仅选择a1
,而我希望它选择全部3个a_tags
(因为它们都跟着b_tag[3]
。
然后//a_tag[preceding-sibling::b_tag[1]][following-sibling::b_tag[2]]
如所期望地选择a2
,但是我希望选择//a_tag[preceding-sibling::b_tag[2]][following-sibling::b_tag[3]]
的{{1}}变成空的。
如果您扔了一些我希望什么都不会选择的东西,例如a3
,请选择//a_tag[preceding-sibling::b_tag[2]][following-sibling::b_tag[1]]
。
还有更多类似的东西,但是我相信问题已经很清楚了。任何光对此表示赞赏。
答案 0 :(得分:2)
好的,让我解释一下它的工作原理。
//a_tag[following-sibling::b_tag[$n]]
用一般语言来说,这意味着让我所有拥有$ n个后代同胞的a_tag
。
考虑以下示例:
// a_tag [关注兄弟姐妹:: b_tag [1]]
这告诉我所有a_tag
之后有1个b_tag
的对象。现在,示例中的所有a_tag
在b_tag
之后都有1个a_tag
,您将看到所有3个a_tag
被选中。
在xpath下使用时,您只会看到选择的第一个a_tag
,因为这是唯一后面有3个b_tag
的标记。
// a_tag [关注兄弟姐妹:: b_tag [3]]
来到下面的xpath
// a_tag [上一个兄弟姐妹:: b_tag [1]] [下一个兄弟姐妹:: b_tag [2]]
在xpath中有多个条件[]
时,它将从左到右执行,这意味着它将完成左侧条件,然后应用下一个条件。因此,以上xpath的含义是让我所有a_tag
的{{1}}的前1个和后2个,所以b_tag
是唯一具有a2
(1 b_tag)之前和b1
(2 b_tags)之后。
b2 and b3
会给您空虚,因为您没有//a_tag[preceding-sibling::b_tag[2]][following-sibling::b_tag[3]]
,前两个a_tag
,后三个b_tag
。
现在,您应该在b_tags
为什么选择//a_tag[preceding-sibling::b_tag[2]][following-sibling::b_tag[1]]
的原因之下。
希望我很清楚。
答案 1 :(得分:1)
但是,使用
//a_tag[following-sibling::b_tag[3]]
仅选择a1
,而我希望它选择全部3个a_tags
(因为它们都跟着b_tag[3]
)。
以下是调整模型以匹配XPath实际行为的方法:
//a_tag
a_tag
元素(如上所述)。//a_tag[following-sibling::b_tag[3]]
a_tag
元素中,仅选择在同级b_tag
元素后有第三个元素的 ,该元素仅是单个{{ 1}},如观察到的那样。