请求生成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
相关产品推荐
相关产品推荐

