File: Data.xml <?xml version="1.0" encoding="US-ASCII"?> <?xml-stylesheet href="Transform.xslt" type="text/xsl"?> <uscities> <western> <uscity state="Nevada">Las Vegas</uscity> <uscity state="Arizona">Phoenix</uscity> <uscity state="California">San Francisco</uscity> <uscity state="Nevada">Silver City</uscity> <uscity state="Washington">Seattle</uscity> <uscity state="Montana">Missoula</uscity> </western> </uscities> File: Transform.xslt <?xml version="1.0" encoding="US-ASCII"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" /> <xsl:key name="list" match="uscity" use="@state" /> <xsl:template match="/"> <html> <head> <title>Western State Cities</title> </head> <body> <xsl:for-each select="/uscities/western/uscity[generate-id(.)=generate-id(key('list', @state))]/@state"> <xsl:sort /> <h2> <xsl:value-of select="." /> </h2> <ul> <xsl:for-each select="key('list', .)"> <xsl:sort /> <li> <xsl:value-of select="." /> </li> </xsl:for-each> </ul> </xsl:for-each> </body> </html> </xsl:template> </xsl:stylesheet> Output: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Western State Cities</title> </head><body> <h2>Arizona</h2> <ul> <li>Phoenix</li> </ul> <h2>California</h2> <ul> <li>San Francisco</li> </ul> <h2>Montana</h2> <ul> <li>Missoula</li> </ul> <h2>Nevada</h2> <ul> <li>Las Vegas</li> <li>Silver City</li> </ul> <h2>Washington</h2> <ul> <li>Seattle</li> </ul> </body> </html>