使用XSLT统计XML中唯一id数量结果异常,求问题分析
你得到<total>22</total>的结果,说明代码要么没正确实现去重逻辑,要么计数逻辑完全偏离预期,以下是几种最可能的问题:
未实现正确的去重逻辑
若使用XSLT 2.0及以上版本,需用distinct-values(//id)获取所有唯一id值后统计长度。如果没调用这个函数,直接遍历所有<id>节点计数,就会把重复id的出现次数全部累加——比如2个唯一值各出现11次,最终结果就是22。
要是用XSLT 1.0,必须通过<xsl:key>做分组去重:先定义key指向<id>节点的文本值,再通过count(key('id-key', //id)[generate-id() = generate-id(key('id-key', .)[1])])统计唯一值数量。如果跳过这个分组步骤,直接统计所有<id>节点的总数,得到的自然是重复值的总出现次数,而非唯一值数量。XPath路径匹配范围错误
你的XPath可能匹配到了文档中其他非目标<id>节点,比如除了<Resources>下的id,还误匹配了其他节点下的id,导致统计范围被扩大,最终总数变成22。要确保路径精准,比如用//Resources/id定位目标节点,而非宽泛的//id。计数逻辑逻辑颠倒
可能代码里错误地累加了每个唯一id的出现次数,而非统计唯一id的个数。比如2个id各出现11次,累加后结果就是22,完全偏离了“统计唯一值数量”的需求。节点遍历重复统计
如果代码在循环<Resources>节点时,每次循环都重复统计所有id,而非汇总全局唯一值,比如4个<Resources>节点反复统计重复项,最终累加也会得到错误的总数。
内容的提问来源于stack exchange,提问作者prime

