以下是 XSLT 2 或更高版本中的嵌套分组如何使这变得简单:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="3.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all">
<xsl:output method="html" indent="yes" version="5.0"/>
<xsl:template match="global">
<html>
<head>
<title>nested grouping example</title>
</head>
<body>
<ul>
<xsl:for-each-group select="item" group-by="@university">
<li><h3><xsl:value-of select="@university"/></h3></li>
<p>Count: <xsl:value-of select="count(current-group())"/></p>
<ul>
<xsl:for-each-group select="current-group()" group-by="@staff">
<li><h4><xsl:value-of select="@staff"/></h4></li>
<p>Count: <xsl:value-of select="count(current-group())"/></p>
<ul>
<xsl:for-each select="current-group()">
<li><xsl:value-of select="@course"/></li>
</xsl:for-each>
</ul>
</xsl:for-each-group>
</ul>
</xsl:for-each-group>
</ul>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
通过 XSLT 1 中的两个级别键和 Muenchian 分组,您可以做到
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>
<xsl:key name="key_univ" match="/global/item" use="@university"/>
<xsl:key name="key_staff" match="/global/item" use="concat(@university, '|', @staff)"/>
<xsl:template match="global">
<html>
<body>
<ul>
<xsl:apply-templates select="item[generate-id() = generate-id(key('key_univ', @university)[1])]"/>
</ul>
</body>
</html>
</xsl:template>
<xsl:template match="item">
<li><h3><xsl:value-of select="@university"/></h3></li>
<p>Count: <xsl:value-of select="count(key('key_univ', @university))"/></p>
<ul>
<xsl:for-each select="key('key_univ', @university)[generate-id() = generate-id(key('key_staff', concat(@university, '|', @staff))[1])]">
<li><h4><xsl:value-of select="@staff"/></h4></li>
<p>Count: <xsl:value-of select="count(key('key_staff', concat(@university, '|', @staff)))"/></p>
<ul>
<xsl:for-each select="key('key_staff', concat(@university, '|', @staff))">
<li><xsl:value-of select="@course"/></li>
</xsl:for-each>
</ul>
</xsl:for-each>
</ul>
</xsl:template>
</xsl:stylesheet>