基于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
相关产品推荐
相关产品推荐

