如何用纯XPath 3正确处理XML重复标签,生成制表符分隔键值对
XPath处理重复标签生成键值对的修正
原始XML结构:
<root> <item> <a>i1.a1</a> <b>i1.b1</b> </item> <item> <b>i2.b1</b> <c>i2.c1</c> </item> <item> <a>i3.a1</a> <a>i3.a2</a> </item> </root>
期望生成的制表符分隔键值对记录:
a=i1.a1 b=i1.b1 b=i2.b1 c=i2.c1 a=i3.a1 a=i3.a2
当前使用的XPath表达式存在缺陷:仅输出每个标签的最后一个值,无法处理重复标签(如第三个item中的两个<a>标签仅输出了a=i3.a2):
//item/string-join( for $name in distinct-values( */name() ) return concat( $name, "=", string( *[name()=$name][last()]/text() ) ), codepoints-to-string(9) )
修正后的XPath表达式
//item/string-join( for $elem in * return concat(local-name($elem), "=", string($elem)), codepoints-to-string(9) )
修正说明
- 不再通过
distinct-values()去重标签名,直接遍历item下的每一个子元素,保留所有重复标签的条目 - 对每个子元素直接拼接
标签名=文本值,避免了通过标签名筛选时只取最后一个元素的问题 - 最终用制表符(
codepoints-to-string(9))连接所有键值对,完全匹配期望输出
内容的提问来源于stack exchange,提问作者Fravadona
相关产品推荐
相关产品推荐

