You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 11:42:48