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

基于XML下层节点值获取上层XPath节点值

多Data节点下用XPath获取指定SERepeatKey的解决方案

当然可以实现你的需求!你之前遇到的错误,是因为写的XPath返回了多个@SERepeatKey属性节点(看你提供的XML,有两个IData的Value是"1"),但string()函数只能处理单个节点,所以才会抛出那个序列过长的错误。

核心思路

我们需要先定位到满足ItemOID="REQUIRED.REQ_V"且Value="1"的IData节点,再向上追溯到它所属的SEData节点,最后提取该节点的SERepeatKey属性值。

具体XPath写法

1. 获取所有符合条件的SERepeatKey值

如果你需要拿到所有匹配的结果(比如你的XML里的2和3),可以用这条XPath:

//IData[@ItemOID='REQUIRED.REQ_V' and @Value='1']/ancestor::SEData/@SERepeatKey

这里用ancestor::SEData直接定位到IData的祖先节点SEData,比逐层向上找父节点更清晰易懂。

2. 只获取第一个符合条件的值(也就是你要的2)

如果只需要返回第一个匹配的结果,给节点加上索引限定,再用string()转换即可:

string(//IData[@ItemOID='REQUIRED.REQ_V' and @Value='1']/ancestor::SEData[1]/@SERepeatKey)

或者如果你用的是XPath 2.0及以上版本,也可以用head()函数直接取序列的第一个元素:

string(head(//IData[@ItemOID='REQUIRED.REQ_V' and @Value='1']/ancestor::SEData/@SERepeatKey))

为什么你之前的XPath会报错?

你原来的语句没有加入Value="1"的过滤条件,导致匹配了所有符合SKey='003-003'和SiteRef[@LOID='SE 003']的SEData节点,返回了3个@SERepeatKey值,超出了string()函数的参数要求。现在加上针对IData的精准过滤,就能完美定位到你需要的节点了。

内容的提问来源于stack exchange,提问作者user2568374

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 09:28:14