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

如何在XSLT中基于Muenchian分组统计各组元素数量?

XML分组并统计每组元素数量

原始输入XML

<?xml version="1.0" encoding="utf-8"?>
<items>
    <element name="Name1" value="Text1"/>   
    <element name="Name1" value="Text3"/>
    <element name="Name1" value="Text4"/>   
    <element name="Name3" value="Text5"/>   
    <element name="Name3" value="Text8"/>   
</items>

需求说明

需要将元素按name属性分组,同时统计每组的元素数量,输出指定格式的XML。

期望输出XML

<?xml version="1.0"?>
<goods>
    <group name="Name1" sum="3">
        <item>Text1</item>
        <item>Text3</item>
        <item>Text4</item>
    </group>
    
    <group name="Name3" sum="2">
        <item>Text5</item>
        <item>Text8</item>
    </group>
</goods>

现有XSLT代码(已实现Muenchian分组)

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:key name="PC" match="element" use="@name"/>    
    <xsl:template match="items">
        <goods>
            <xsl:apply-templates select="element[generate-id(.) = generate-id(key('PC',@name))]"/>          
        </goods>
    </xsl:template>
    
    <xsl:template match="element">
        <group name="{@name}">
            <xsl:for-each select="key('PC',@name)">
                <item>
                    <xsl:value-of select="@value"/>
                </item>
            </xsl:for-each>         
        </group>
    </xsl:template>     
</xsl:stylesheet>

解决方案:添加分组数量统计

只需修改<group>标签,新增sum属性,通过count(key('PC',@name))获取当前分组的元素总数即可。修改后的完整XSLT代码如下:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:key name="PC" match="element" use="@name"/>    
    <xsl:template match="items">
        <goods>
            <xsl:apply-templates select="element[generate-id(.) = generate-id(key('PC',@name))]"/>          
        </goods>
    </xsl:template>
    
    <xsl:template match="element">
        <!-- 新增sum属性,用count统计当前分组的元素数量 -->
        <group name="{@name}" sum="{count(key('PC',@name))}">
            <xsl:for-each select="key('PC',@name)">
                <item>
                    <xsl:value-of select="@value"/>
                </item>
            </xsl:for-each>         
        </group>
    </xsl:template>     
</xsl:stylesheet>

说明

count(key('PC',@name))会返回当前name属性对应的所有分组元素的个数,直接将该值赋值给sum属性就能完成统计需求。

内容的提问来源于stack exchange,提问作者MagicWorld

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 03:42:43