如何使用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
相关产品推荐
相关产品推荐

