XPATH查询问题:匹配当前节点@newid与目标节点@id无效果
XPATH查询无结果问题排查
问题场景
现有XML结构如下:
<content> <root> <parametrs @id='par1'><displayText>Text1</displayText></parametrs> <parametrs @id='par2'><displayText>Text2</displayText></parametrs> <parametrs @id='par3'><displayText>Text3</displayText></parametrs> </root> </content> ... <paragraph @newid='par3'>Any text</paragraph>
使用XPATH表达式 ancestor::content/root/parametrs[@id = ../@newid]/displayText/ 查询时无结果,但 ancestor::content/root/parametrs[@id = 'par1']/displayText/ 能正常返回内容,单独执行 ./@newid 也能正确获取到par3的值。
问题原因
问题出在表达式里的../@newid部分:当你进入parametrs节点的上下文后,../指向的是它的父节点root,而root节点并没有newid属性——newid是属于paragraph节点的属性。此时上下文已经从初始的paragraph切换到了parametrs,自然无法拿到目标属性值。
解决方案
要在parametrs的条件里引用初始paragraph的newid属性,需要保留初始节点的上下文,推荐使用以下写法:
ancestor::content/root/parametrs[@id = current()/@newid]/displayText
这里的current()会固定指向你初始的paragraph节点,不会因为进入parametrs节点而改变上下文,从而正确完成属性值的匹配。
如果是在无current()支持的环境中,也可以用绝对路径定位paragraph节点:
ancestor::content/root/parametrs[@id = //paragraph/@newid]/displayText
验证说明
使用修正后的表达式后,会准确匹配到id='par3'的parametrs节点,返回对应的displayText内容。
内容的提问来源于stack exchange,提问作者Andrey Golovatuk
相关产品推荐
相关产品推荐

