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

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>

修正说明

  1. 调整分组键:将key的匹配对象改为year/value,确保每个年份值都能作为独立分组键
  2. 去重逻辑:通过generate-id筛选唯一的年份节点,避免重复分组
  3. 关联人员:通过key('year-key', .)/../../Person定位到当前年份对应的所有Person节点
  4. 排序处理:对年份做数值倒序排序,对人员姓名做升序排序,保证输出顺序符合预期

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 06:35:20