如何基于meta兄弟节点的material值编写XPath获取匹配的dataobj节点
XPath基于同级节点值匹配对应节点的解决方法
你之前写法出错的核心原因是:谓词(方括号[])内部的上下文会切换为当前正在筛选的节点,所以你在dataobj0[material = ./material]里的第二个./material指向的是正在匹配的dataobj0节点的子元素material,自然无法拿到外层meta节点的值。
方案1:使用current()函数(适用于支持XSLT/标准XPath处理器的场景)
当你的当前上下文已经定位到某个<meta>节点时,直接使用current()函数引用初始上下文的meta节点即可,写法如下:
- 同时匹配所有dataobj0、dataobj1节点:
../*[starts-with(name(), 'dataobj')][material = current()/material] - 单独匹配dataobj0:
../dataobj0[material = current()/material] - 单独匹配dataobj1:
../dataobj1[material = current()/material]
原理:current()函数返回的是XPath表达式执行时的初始上下文节点,不受谓词内部的上下文切换影响,因此这里current()/material会正确取到当前正在遍历的meta节点的material值。
方案2:先存值再匹配(适用于不支持current()的轻量XPath 1.0处理器场景)
如果你使用的XPath处理器不支持current()函数,可以在遍历meta节点时,先将当前meta的material值提取为变量,再将变量代入过滤条件:
- 先获取当前meta的material值,存为变量
$cur_material = ./material/text() - 再用变量过滤dataobj节点:
../dataobj0[material = $cur_material]../dataobj1[material = $cur_material]
这种方式完全避开了上下文混淆的问题,兼容性更好。
内容的提问来源于stack exchange,提问作者Micha
相关产品推荐
相关产品推荐

