如何用XPath选择节点的前置同辈节点(含兄弟姐妹)
XPath选择指定前置“同辈”节点的优化方案咨询
给定如下XML结构:
<root> <level1> <level2 id="1"/> <level2 id="2"/> <level2 id="3"/> <level2 id="4"/> </level1> <level1> <level2 id="5"> <level2 id="9"/> </level2> <level2 id="6"/> <level2 id="7"/> <level2 id="8"/> </level1> </root>
需求场景:
- 当上下文节点为
/root/level1/level2[@id='6']时,需选择id="5"的节点(而非id="9"); - 当上下文节点为
/root/level1/level2[@id='5']时,需选择id="4"的节点。
现有XPath轴的局限性:
preceding-sibling在第一种场景有效,但第二种场景失效;preceding则刚好相反,无法满足第一种场景的需求。
当前解决方案
XPath 3.1(XSLT 3环境)
(/root/level1/level2[@id='6']/preceding::level2 intersect /root/level1/level2)[last()]
该方案可行但略显繁琐,且可能存在效率问题,想确认是否有更简洁的通用解决方案。
XSLT 1.0
/root/level1/level2[@id='6']/preceding::level2[parent::level1[parent::root]][1]
曾尝试过类似/root/level1/level2[@id='6']/preceding::(root/level/level2)[1]的写法,但不确定是否符合语法规范。
补充需求
需要支持选择所有n阶同辈节点(0阶为兄弟姐妹),目前找到的相对简洁的方案为:
let $this = .... (root/level1/level2)[. << $this][last()]
但部分方案仅能匹配0阶和1阶同辈,通用方案又较为繁琐。
内容的提问来源于stack exchange,提问作者MrD at KookerellaLtd
相关产品推荐
相关产品推荐

