对前兄弟姐妹和后兄弟姐妹的影响感到困惑

时间:2019-05-01 18:43:41

标签: xml xpath

我对必须具备的基本知识感到困惑,以前的问题(和文档)并没有真正的帮助。

说我们有这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]]有点夸张,正确选择了a1a2。但是,使用//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]]

还有更多类似的东西,但是我相信问题已经很清楚了。任何光对此表示赞赏。

2 个答案:

答案 0 :(得分:2)

好的,让我解释一下它的工作原理。

//a_tag[following-sibling::b_tag[$n]]

用一般语言来说,这意味着让我所有拥有$ n个后代同胞的a_tag 。 考虑以下示例:

  

// a_tag [关注兄弟姐妹:: b_tag [1]]

这告诉我所有a_tag之后有1个b_tag的对象。现在,示例中的所有a_tagb_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}},如观察到的那样。