我希望使用单个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] 之间存在任何干预元素,则不应选择任何内容。
答案 0 :(得分:4)
我能找到的最简单的是:
//start/following-sibling::a intersect //start/following-sibling::*[name()!='a'][1]/preceding-sibling::a
这是做什么的:
a
start
之后的所有//start/following-sibling::a
兄弟姐妹。 (结果:a2,a3,a4。)暂时将其设置为一侧。start
之后的第一个非兄弟姐妹://start/following-sibling::*[name()!='a'][1]
(结果:b。)a
个节点:/preceding-sibling::a
。 (结果:a1,a2,a3) 更新:另一种表达方式是//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”