Following XSL converts the xml data into a format where first tag of the element is converted into heading and all elements having the same value for first tag will appear in a table below that heading. The Xml elements must be sorted by first tag.
To understand the transformation, consider the following Xml:
<mydata> <contact> <name>Mark</name> <telephone>34546343</telephone> <description>Work</description> </contact> <contact> <name>Mark</name> <telephone>98884748</telephone> <description>Home</description> </contact>= <contact> <name>Mark</name> <telephone>23456123</telephone> <description>Mobile</description> </contact> <contact> <name>William</name> <telephone>23098764</telephone> <description>Mobile</description> </contact> <contact> <name>William</name> <telephone>45645356</telephone> <description>Work</description> </contact> </mydata>
The XSL generates the following output:
Contact: Mark
Telephone Description 34546343 Work 98884748 Home 23456123 Mobile Contact: William
Telephone Description 23098764 Mobile 45645356 Work
XSL is following:
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" > <xsl:template match="/"> <html> <body> <xsl:for-each select="mydata/contact"> <xsl:if test="name != preceding-sibling::contact[1]/name or position() = 1"> <H3> Contact: <xsl:value-of select="name"/> </H3> <table border="1"> <tr bgcolor="#9acd32"> <th>Telephone</th> <th>Description</th> </tr> <xsl:apply-templates select="."/> <xsl:variable name="curObject" select="name"/> <xsl:apply-templates select="following-sibling::contact[name = $curObject]"></xsl:apply-templates> </table> </xsl:if> </xsl:for-each> </body> </html> </xsl:template> <xsl:template match="contact"> <tr> <td> <xsl:value-of select="telephone"/></td> <td> <xsl:value-of select="description"/></td> </tr> </xsl:template> </xsl:stylesheet>