XSLT 1.0 多值分组求助:按年份值分组人员记录
解决按年份分组的XSLT问题
原始XML结构
<Record> <Person> <name>Jim</name> <year> <value>2022</value> </year> </Person> </Record> <Record> <Person> <name>Mary</name> <year> <value>2022</value> <value>2023</value> </year> </Person> </Record> <Record> <Person> <name>Linda</name> <year> <value>2022</value> <value>2021</value> </year> </Person> </Record>
需求与问题
需要按year/value分组,每个年份下显示所有关联人员,预期结果:
2023 -Mary 2022 -Jim -Linda -Mary 2021 -Linda
原有Muenchian分组仅能获取第一个年份的分组结果,核心问题是:
- 原XSLT的key匹配对象是
Person,当一个Person有多个年份值时,year/value会默认取第一个节点的值,导致分组仅基于第一个年份 - 遍历
Record模板会重复处理节点,无法覆盖所有年份
修正后的XSLT代码
列表形式输出
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <!-- 按每个year/value的值作为分组键 --> <xsl:key match="year/value" name="year-key" use="."/> <xsl:template match="/"> <!-- 获取所有唯一的年份节点并去重 --> <xsl:for-each select="//year/value[generate-id(.) = generate-id(key('year-key', .)[1])]"> <!-- 按年份倒序排序 --> <xsl:sort select="." data-type="number" order="descending"/> <!-- 输出年份标题 --> <xsl:value-of select="."/> <br/> <!-- 输出该年份下的所有人员 --> <xsl:for-each select="key('year-key', .)/../../Person"> <xsl:sort select="name"/> -<xsl:value-of select="name"/> <br/> </xsl:for-each> <br/> </xsl:for-each> </xsl:template> </xsl:stylesheet>
表格形式输出(适配原有HTML结构)
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:key match="year/value" name="year-key" use="."/> <xsl:template match="/"> <xsl:for-each select="//year/value[generate-id(.) = generate-id(key('year-key', .)[1])]"> <xsl:sort select="." data-type="number" order="descending"/> <table class="table table-striped table-bordered" summary="list of {.} people"> <tr> <th><xsl:value-of select="."/></th> </tr> <xsl:for-each select="key('year-key', .)/../../Person"> <xsl:sort select="name"/> <tr> <td> <a href="{link}" target="_blank"> <xsl:value-of select="name"/> </a> </td> </tr> </xsl:for-each> </table> <br/> </xsl:for-each> </xsl:template> </xsl:stylesheet>
修正说明
- 调整分组键:将key的匹配对象改为
year/value,确保每个年份值都能作为独立分组键 - 去重逻辑:通过
generate-id筛选唯一的年份节点,避免重复分组 - 关联人员:通过
key('year-key', .)/../../Person定位到当前年份对应的所有Person节点 - 排序处理:对年份做数值倒序排序,对人员姓名做升序排序,保证输出顺序符合预期
内容的提问来源于stack exchange,提问作者erichert
相关产品推荐
相关产品推荐

