如何用单个XPath查询获取父节点与子节点值的元组?
单个XPath查询实现分类-动物元组的方案
当然可以用单条XPath查询搞定这个需求!不过具体写法得看你用的是XPath 1.0还是2.0及以上版本(不同版本支持的语法差异不小),咱们结合你的XML示例来拆解:
首先先把你的XML示例贴出来方便对照:
<animals> <mammals> <an>dog</an> <an>cat</an> </mammals> <reptiles> <an>snake</an> </reptiles> </animals>
XPath 2.0+ 方案(推荐,支持结构化输出)
如果你的环境支持XPath 2.0或更高版本(比如XQuery、Saxon处理器、现代XML编辑器插件等),可以直接用for表达式生成结构化的元组序列:
for $an in //an return (local-name($an/parent::*), $an/text())
这条查询的逻辑很简单:
- 遍历所有
<an>元素(//an) - 对每个
<an>,先取它父元素的本地名称(也就是mammals或reptiles),再取它的文本内容(动物名称) - 把这两个值组合成一个二元组返回
如果你的工具支持更明确的元组语法(比如某些XQuery环境),还可以写成带键名的形式,可读性更好:
for $an in //an return tuple(category := local-name($an/parent::*), animal := $an/text())
执行后会直接得到类似(category: "mammals", animal: "dog")这样的结构化元组。
XPath 1.0 方案(兼容旧环境)
要是你只能用XPath 1.0(比如原生浏览器DOM、旧版XML解析库),因为1.0不支持返回多值元组或序列,咱们可以退而求其次,生成拼接好的字符串,之后再拆分:
//an/concat(local-name(parent::*), ',', text())
这条查询会返回三个字符串结果:
mammals,dogmammals,catreptiles,snake
虽然不是严格的元组,但用逗号拆分后就能得到你想要的配对,完全满足需求。
内容的提问来源于stack exchange,提问作者Binyamin Even
相关产品推荐
相关产品推荐

