使用XPath 1.0实现XML商品去重并按数量降序统计
解决XSLT 1.0中XML商品统计排序的问题
嘿,我来帮你搞定这个统计排序的需求!在XSLT 1.0里没有原生的分组函数,咱们得用Muenchian分组法来实现去重+计数,再配合排序就能达到你要的效果。
核心思路拆解
- 定义分组键:先给每个
item的title创建一个键,方便后续分组统计; - 获取唯一分组:筛选出每个
title对应的第一个item节点,实现去重; - 统计分组数量:通过键匹配所有同
title的节点,用count()计算总数; - 按数量降序排序:对分组后的结果按计数数值倒序排列。
完整XSLT代码示例
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 定义分组键:根据item的title值分组 --> <xsl:key name="item-by-title" match="item" use="title"/> <xsl:template match="/store"> <!-- 输出标题行 --> <p>item name (total item in the xml)</p> <!-- 遍历每个唯一的item分组 --> <xsl:for-each select="item[generate-id() = generate-id(key('item-by-title', title)[1])]"> <!-- 按计数降序排序 --> <xsl:sort select="count(key('item-by-title', title))" order="descending" data-type="number"/> <!-- 输出格式:标题(数量) --> <p> <xsl:value-of select="title"/> <xsl:text> (</xsl:text> <xsl:value-of select="count(key('item-by-title', title))"/> <xsl:text>)</xsl:text> </p> </xsl:for-each> </xsl:template> </xsl:stylesheet>
代码细节解释
<xsl:key>:创建名为item-by-title的键,把所有item节点按title的值关联起来,这是Muenchian分组的基础;generate-id() = generate-id(key('item-by-title', title)[1]):这行是去重的核心逻辑,只保留每个title分组里的第一个节点,避免重复处理;<xsl:sort>:指定按分组的计数数值降序排列,data-type="number"确保是按数字大小排序,而不是字符串字典序;count(key('item-by-title', title)):通过键匹配所有同title的item节点,直接统计出该商品的总数量。
最终输出结果
用你的XML文档测试后,会生成完全符合要求的格式:
<p>item name (total item in the xml)</p> <p>boots (3)</p> <p>shoes (2)</p> <p>tshirt (1)</p>
内容的提问来源于stack exchange,提问作者Barry Allen
相关产品推荐
相关产品推荐

