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

如何使用XSLT 1.0 Muenchian分组在每个catalog内按title分组

解决方案

核心解决思路:你之前使用Muenchian分组得到全局分组结果,是因为分组key仅用到了title字段。要实现每个catalog内部单独分组,只需要把所属catalog的唯一标识和title拼接作为分组key,即可避免跨catalog的分组混淆,完整实现代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
    <!-- 定义分组key:拼接所属catalog的唯一id和cd的title -->
    <xsl:key name="cd-by-catalog-and-title" match="cd" use="concat(generate-id(ancestor::catalog[1]), '|', title)"/>

    <xsl:template match="/hello">
        <xsl:apply-templates select="catalog"/>
    </xsl:template>

    <xsl:template match="catalog">
        <Song>
            <Desc>
                <!-- 按顺序生成catalog描述 -->
                <xsl:choose>
                    <xsl:when test="position() = 1">From First Catalog</xsl:when>
                    <xsl:when test="position() = 2">From Second Catalog</xsl:when>
                    <xsl:otherwise>From <xsl:value-of select="position()"/>th Catalog</xsl:otherwise>
                </xsl:choose>
            </Desc>
            <!-- 筛选当前catalog下每个title分组的第一个cd -->
            <xsl:for-each select="cd[count(. | key('cd-by-catalog-and-title', concat(generate-id(current()), '|', title))[1]) = 1]">
                <nameofAlbum>
                    <xsl:value-of select="title"/>
                </nameofAlbum>
            </xsl:for-each>
        </Song>
    </xsl:template>
</xsl:stylesheet>

核心逻辑说明

  • 分组key中的generate-id(ancestor::catalog[1])会为每个catalog节点生成全局唯一标识,和title拼接后,不同catalog下的同titlecd会生成不同的key,天然避免跨 catalog 分组
  • 筛选分组首节点时,current()指代当前正在处理的catalog节点,保证仅匹配当前catalog下的同组cd

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 19:54:03