File: Data.xml <?xml version="1.0" encoding="utf-8"?> <data> <AAA> <BBB id="b1"> <CCC name="q" size="12"/> <EEE id="e1"> <SSS/> </EEE> <CCC weight="45"/> <CCC/> </BBB> </AAA> <AAA> <EEE id="e2"/> <CCC> <DDD/> <DDD/> </CCC> </AAA> </data> File: Transform.xslt <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <TABLE border="1" width="90%"> <xsl:apply-templates select="//*"/> </TABLE> </xsl:template> <xsl:template match="*"> <xsl:if test="not(descendant::*[name()=name(current())] | following::*[name()=name(current())])"> <TR> <TD> <xsl:value-of select="name()"/> </TD> <TD> <xsl:apply-templates select="." mode="list"/> </TD> </TR> </xsl:if> </xsl:template> <xsl:template match="*" mode="list"> <xsl:for-each select="//*[name()=name(current())]/*"> <xsl:value-of select="name()"/> </xsl:for-each> </xsl:template> </xsl:stylesheet> Output: <?xml version="1.0" encoding="UTF-8"?><TABLE border="1" width="90%"><TR><TD>data</TD><TD>AAAAAA</TD></TR><TR><TD>BBB</TD><TD>CCCEEECCCCCC</TD></TR><TR><TD>SSS</TD><TD/></TR><TR><TD>AAA</TD><TD>BBBEEECCC</TD></TR><TR><TD>EEE</TD><TD>SSS</TD></TR><TR><TD>CCC</TD><TD>DDDDDD</TD></TR><TR><TD>DDD</TD><TD/></TR></TABLE>