如何在group-by分组中为每个唯一分组生成序列编号
按分组生成序列编号的实现方案
针对给定的经销商车辆XML数据,我们可以用XSLT实现按Series分组并为每个唯一分组生成3位序列编号的需求,具体实现如下:
输入XML数据
<Dealer> <Vehicle> <Model>KA</Model> <Series>Type A</Series> <Price>1000.00</Price> </Vehicle> <Vehicle> <Model>KA</Model> <Series>Type A</Series> <Price>1400.00</Price> </Vehicle> <Vehicle> <Model>KA</Model> <Series>Type C</Series> <Price>1100.00</Price> </Vehicle> <Vehicle> <Model>FOCUS</Model> <Series>Type C</Series> <Price>5000.00</Price> </Vehicle> <Vehicle> <Model>FIESTA</Model> <Series>Type B</Series> <Price>6000.00</Price> </Vehicle> </Dealer>
实现用的XSLT代码
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" encoding="UTF-8"/> <!-- 定义分组键:按Series的值分组 --> <xsl:key name="series-group" match="Vehicle" use="Series"/> <xsl:template match="/Dealer"> <!-- 遍历所有唯一的Series分组 --> <xsl:for-each select="Vehicle[generate-id() = generate-id(key('series-group', Series)[1])]"> <!-- 获取当前分组的序列编号,格式化为3位带前导零 --> <xsl:variable name="group-number" select="format-number(position(), '000')"/> <!-- 遍历当前分组下的所有Vehicle节点 --> <xsl:for-each select="key('series-group', Series)"> <xsl:value-of select="Model"/> <xsl:text> </xsl:text> <xsl:value-of select="Series"/> <xsl:text> </xsl:text> <xsl:value-of select="Price"/> <xsl:text> </xsl:text> <xsl:value-of select="$group-number"/> <xsl:text> </xsl:text> </xsl:for-each> </xsl:for-each> </xsl:template> </xsl:stylesheet>
输出结果
KA Type A 1000.00 001 KA Type A 1400.00 001 KA Type C 1100.00 002 FOCUS Type C 5000.00 002 FIESTA Type B 6000.00 003
关键步骤说明
- 分组定义:通过
<xsl:key>创建基于Series值的分组键,把所有同Series的Vehicle归为一组。 - 唯一分组筛选:用
generate-id()判断当前Vehicle是否是对应分组的第一个节点,以此筛选出所有唯一的Series分组。 - 序列编号生成:用
position()获取分组的顺序号,再通过format-number()把编号格式化为3位带前导零的字符串(比如1变成001)。 - 分组内遍历输出:对每个唯一分组,遍历其下所有Vehicle节点,拼接Model、Series、Price和分组编号,输出为文本行。
内容的提问来源于stack exchange,提问作者Richa Kumari
相关产品推荐
相关产品推荐

