Multi-level
File: Data.xml <?xml version="1.0"?> <staff> <employee name="J" department="sales" location="New York" /> <employee name="B" department="personnel" location="Los Angeles" /> <employee name="C" department="transport" location="New York" /> <employee name="W" department="personnel" location="Los Angeles" /> <employee name="M" department="sales" location="Seattle" /> </staff> File: Transform.xslt <?xml version="1.0"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" indent="yes" /> <xsl:template match="staff"> <xsl:for-each-group select="employee" group-by="@location"> <xsl:sort select="current-grouping-key()" /> <p class="indent0"> <xsl:text>Location </xsl:text> <xsl:value-of select="current-grouping-key()" /> </p> <xsl:for-each-group select="current-group()" group-by="@department"> <xsl:sort select="current-grouping-key()" /> <p class="indent1"> <xsl:text>Location </xsl:text> <xsl:value-of select="current-grouping-key()" /> </p> <xsl:for-each select="current-group()"> <xsl:sort select="@name" /> <p class="indent2"> <xsl:text>Location </xsl:text> <xsl:value-of select="@name" /> </p> </xsl:for-each> </xsl:for-each-group> </xsl:for-each-group> </xsl:template> </xsl:stylesheet> Output: <p class="indent0">Location Los Angeles</p> <p class="indent1">Location personnel</p> <p class="indent2">Location B</p> <p class="indent2">Location W</p> <p class="indent0">Location New York</p> <p class="indent1">Location sales</p> <p class="indent2">Location J</p> <p class="indent1">Location transport</p> <p class="indent2">Location C</p> <p class="indent0">Location Seattle</p> <p class="indent1">Location sales</p> <p class="indent2">Location M</p>