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

如何使用XSLT按姓氏和年龄两个XML元素分组并计数?

按姓氏和年龄联合分组统计的XSLT解决方案

原始XML数据

<root>
    <cust>
        <firstname>bob</firstname>
        <lastname>smith</lastname>
        <age>40</age>
    </cust>
    <cust>
        <firstname>joe</firstname>
        <lastname>smith</lastname>
        <age>75</age>
    </cust>
    <cust>
        <firstname>joe</firstname>
        <lastname>brown</lastname>
        <age>25</age>
    </cust>
    <cust>
        <firstname>pete</firstname>
        <lastname>smith</lastname>
        <age>40</age>
    </cust>
</root>

原单字段分组XSLT及结果

原XSLT仅实现按姓氏分组统计:

<xsl:key name="custs-by-lastname" match="cust" use="lastname"/>

<xsl:template match="/">
    <html><body>
        <table border="1">
            <tr><th>Name</th><th>#</th></tr>
            <xsl:for-each select="/root/cust[count(. | key('custs-by-lastname', lastname)[1]) = 1]">
                <xsl:sort select="lastname"/>
                <tr>
                    <td><xsl:value-of select="lastname"/></td>
                    <td><xsl:value-of select="count(key('custs-by-lastname', lastname))"/></td>
                </tr>
            </xsl:for-each>
        </table>
    </body></html>
</xsl:template>

输出结果:

Name   #
brown  1
smith  3

需求:按姓氏+年龄联合分组计数

期望输出(顺序无关):

Name   Age  #
smith  40   2
brown  25   1
smith  75   1 

修改后的XSLT解决方案

核心是把姓氏和年龄拼接成唯一的分组键,以此实现联合分组:

<xsl:key name="custs-by-lastname-age" match="cust" use="concat(lastname, '|', age)"/>

<xsl:template match="/">
    <html><body>
        <table border="1">
            <tr><th>Name</th><th>Age</th><th>#</th></tr>
            <!-- 筛选每个唯一姓氏+年龄组合的第一个节点 -->
            <xsl:for-each select="/root/cust[count(. | key('custs-by-lastname-age', concat(lastname, '|', age))[1]) = 1]">
                <!-- 先按姓氏排序,再按年龄数值排序 -->
                <xsl:sort select="lastname"/>
                <xsl:sort select="age" data-type="number"/>
                <tr>
                    <td><xsl:value-of select="lastname"/></td>
                    <td><xsl:value-of select="age"/></td>
                    <!-- 统计当前姓氏+年龄组合的总数量 -->
                    <td><xsl:value-of select="count(key('custs-by-lastname-age', concat(lastname, '|', age)))"/></td>
                </tr>
            </xsl:for-each>
        </table>
    </body></html>
</xsl:template>

关键修改说明

  • 调整<xsl:key>的use属性:用concat(lastname, '|', age)把姓氏和年龄拼接成唯一键,中间加|作为分隔符,避免不同组合产生重复键(比如姓氏"a1"年龄"2"和姓氏"a"年龄"12"这类极端情况)。
  • 表格新增Age列,匹配需求输出格式。
  • 分组筛选条件同步改为使用拼接后的键,确保只选中每个联合分组的第一个节点。
  • 增加按年龄的数值排序,让结果更规整(可根据需求调整或移除)。

最终输出结果

Name   Age  #
brown  25   1
smith  40   2
smith  75   1 

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 23:03:17