如何使用XPath查找所有紧邻的兄弟姐妹

时间:2014-10-09 15:22:26

标签: xml xpath

我希望使用单个XPath表达式找到节点的所有紧邻的兄弟节点,如果可能的话。鉴于输入

<a id="1"/>
<start/>
<a id="2"/>
<a id="3"/>
<b/>
<a id="4"/>

和类似于//start/following-sibling::a的XPath表达式,我想选择 a [2] a [3] ,但不是 a [4] 即可。此外,如果开始 a [2] 之间存在任何干预元素,则不应选择任何内容。

2 个答案:

答案 0 :(得分:4)

我能找到的最简单的是:

//start/following-sibling::a intersect //start/following-sibling::*[name()!='a'][1]/preceding-sibling::a

这是做什么的:

  1. 关注a start之后的所有//start/following-sibling::a兄弟姐妹。 (结果:a2,a3,a4。)暂时将其设置为一侧。
  2. 然后选择start之后的第一个非兄弟姐妹://start/following-sibling::*[name()!='a'][1](结果:b。)
  3. 找到其前面的所有a个节点:/preceding-sibling::a。 (结果:a1,a2,a3)
  4. 取1和3的交点。(结果:a2,a3)
  5. 更新:另一种表达方式是//start/following-sibling::*[name()!='a'][1]/preceding-sibling::a[preceding-sibling::start],这大致转换为:在start之后取第一个非兄弟,向后计数,但只选择那些元素仍然以start开头。

    更新2 :如果您知道b将永远被称为b,您当然可以用{更换难以阅读的following-sibling::*[name()!='a'][1]部分{1}}。

答案 1 :(得分:0)

无法测试它,但是//start/following-sibling::*[1][self::a]应该返回紧接着的兄弟,但只有当它是“a”