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

请求生成XSLT:从XML提取唯一名称、计数及总价统计

编写XSLT实现医疗节点按名称分组统计并生成HTML表格

以下是针对需求实现的XSLT代码,支持按<Healthcare>节点的<Name>分组,统计每组节点数量与价格总和,并生成指定样式的HTML表格。

XSLT 1.0版本(兼容大多数处理器)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" indent="yes" encoding="UTF-8"/>
    
    <!-- 定义按Name分组的索引键 -->
    <xsl:key name="healthcare-by-name" match="Healthcare" use="Name"/>
    
    <xsl:template match="/Information">
        <div class="s-table-container">
            <table class="s-table">
                <thead>
                    <tr>
                        <th>Name</th>
                        <th>Count</th>
                        <th>Total Price</th>
                    </tr>
                </thead>
                <tbody>
                    <!-- 筛选每个分组的首个节点,实现分组 -->
                    <xsl:for-each select="Healthcare[generate-id() = generate-id(key('healthcare-by-name', Name)[1])]">
                        <!-- 按名称字母顺序排序 -->
                        <xsl:sort select="Name"/>
                        <tr>
                            <!-- 格式化名称为首字母大写、其余小写 -->
                            <td>
                                <xsl:value-of select="concat(
                                    translate(substring(Name, 1, 1), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'),
                                    translate(substring(Name, 2), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')
                                )"/>
                            </td>
                            <!-- 统计分组内节点数量 -->
                            <td><xsl:value-of select="count(key('healthcare-by-name', Name))"/></td>
                            <!-- 计算分组内价格总和 -->
                            <td><xsl:value-of select="sum(key('healthcare-by-name', Name)/Price)"/></td>
                        </tr>
                    </xsl:for-each>
                </tbody>
            </table>
        </div>
    </xsl:template>
</xsl:stylesheet>

XSLT 2.0+版本(代码更简洁)

如果使用支持XSLT 2.0及以上的处理器,可使用for-each-group简化分组逻辑:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" indent="yes" encoding="UTF-8"/>
    
    <xsl:template match="/Information">
        <div class="s-table-container">
            <table class="s-table">
                <thead>
                    <tr>
                        <th>Name</th>
                        <th>Count</th>
                        <th>Total Price</th>
                    </tr>
                </thead>
                <tbody>
                    <!-- 直接按Name分组 -->
                    <xsl:for-each-group select="Healthcare" group-by="Name">
                        <xsl:sort select="current-grouping-key()"/>
                        <tr>
                            <!-- 格式化名称大小写 -->
                            <td><xsl:value-of select="concat(upper-case(substring(current-grouping-key(),1,1)), lower-case(substring(current-grouping-key(),2)))"/></td>
                            <!-- 统计分组节点数 -->
                            <td><xsl:value-of select="count(current-group())"/></td>
                            <!-- 计算价格总和 -->
                            <td><xsl:value-of select="sum(current-group()/Price)"/></td>
                        </tr>
                    </xsl:for-each-group>
                </tbody>
            </table>
        </div>
    </xsl:template>
</xsl:stylesheet>

关键逻辑说明

  • 分组实现:XSLT 1.0使用Muenchian分组法(通过<xsl:key>和generate-id());XSLT 2.0+直接用for-each-group语法,更直观。
  • 名称格式化:通过字符串处理函数将名称转为首字母大写、其余小写,匹配输出示例中MAX转Max的要求。
  • 统计计算:使用count()获取分组节点数量,sum()计算所有<Price>节点的数值总和。
  • 排序:添加<xsl:sort>确保分组结果按名称字母顺序排列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 19:24:56