File: Data.xml <?xml version="1.0"?> <addressbook> <address> <name> <title>Ms.</title> <first-name>Doris</first-name> <last-name>Smith</last-name> </name> <street>707 New Way</street> <city>New York</city> <state>ME</state> <zip>00218</zip> </address> <address> <name> <title>Ms.</title> <first-name>Jane</first-name> <last-name>Lee</last-name> </name> <street>930-A Street</street> <city>Twincity</city> <state>MA</state> <zip>02930</zip> </address> </addressbook> File: Transform.xslt <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="no"/> <xsl:strip-space elements="*"/> <xsl:variable name="newline"> <xsl:text></xsl:text> </xsl:variable> <xsl:template match="/"> <addressbook> <xsl:for-each select="addressbook/address"> <xsl:sort select="name/last-name"/> <xsl:sort select="name/first-name"/> <xsl:copy-of select="."/> </xsl:for-each> </addressbook> </xsl:template> </xsl:stylesheet> Output: <?xml version="1.0" encoding="UTF-8"?><addressbook><address><name><title>Ms.</title><first-name>Doris</first-name><last-name>Smith</last-name></name><street>707 New Way</street><city>New York</city><state>ME</state><zip>00218</zip></address><address><name><title>Ms.</title><first-name>Jane</first-name><last-name>Lee</last-name></name><street>930-A Street</street><city>Twincity</city><state>MA</state><zip>02930</zip></address></addressbook>