You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用XPath 1.0实现XML商品去重并按数量降序统计

解决XSLT 1.0中XML商品统计排序的问题

嘿,我来帮你搞定这个统计排序的需求!在XSLT 1.0里没有原生的分组函数,咱们得用Muenchian分组法来实现去重+计数,再配合排序就能达到你要的效果。

核心思路拆解

  1. 定义分组键:先给每个item的title创建一个键,方便后续分组统计;
  2. 获取唯一分组:筛选出每个title对应的第一个item节点,实现去重;
  3. 统计分组数量:通过键匹配所有同title的节点,用count()计算总数;
  4. 按数量降序排序:对分组后的结果按计数数值倒序排列。

完整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:03:57