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

