如何在XPath 2.0/3.0中获取Key节点唯一值及出现次数
问题描述
给定如下XML结构:
<Root> <Email> <Key> 1</Key> </Email> <Email> <Key> 1</Key> </Email> <Email> <Key> 2</Key> </Email> <Email> <Key> 2</Key> </Email> <Email> <Key> 3</Key> </Email> </Root>
需要使用XPath 2.0或3.0提取Key节点的唯一值,并统计每个值的出现次数,最终输出格式为:1 (2 time), 2 (2 time), 3 (1 time)。
此前尝试string-join(distinct-values(//Key), ' ')仅能得到唯一值列表,无法包含次数统计,现寻求可行方案。
解决方案
XPath 2.0 实现
通过for循环遍历每个唯一值,结合count统计次数后拼接字符串,再用string-join组合结果:
string-join( for $val in distinct-values(//Key) return concat(normalize-space($val), ' (', count(//Key[normalize-space(.) = normalize-space($val)]), ' time)'), ', ' )
- 使用
normalize-space处理Key值,避免因前后空格导致匹配偏差 - 循环中针对每个唯一值,统计所有匹配的
Key节点数量,拼接成目标格式的片段 - 最后用
string-join将所有片段以,分隔输出
XPath 3.0 实现
利用XPath 3.0新增的group-by分组函数,写法更简洁高效:
string-join( for $group in //Key!normalize-space(.) => group-by(.) return concat($group!key, ' (', count($group!*), ' time)'), ', ' )
- 先提取所有
Key值并去除前后空格 - 通过
group-by(.)按值分组 - 对每个分组,直接获取分组键值和元素数量,拼接后用
string-join组合输出
内容的提问来源于stack exchange,提问作者Ravi Gupta
相关产品推荐
相关产品推荐

