Umbraco/Samples and Articles/XSLT/Print Entire XML Document
It is sometimes difficult to understand where your Xslt logic has gone wrong when you can't actually get a big picture view of the Xml structure that is being sent to your XSLT file. This Xslt macro will provide a tabular printout of the entire XML tree as seen by $currentPage. This macro will output the entire Xml tree of your website so be careful when you use this. I found this macro to be of great help trying to get started with XSLT processing in Umbraco.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE xsl:Stylesheet [ <!ENTITY nbsp " "> ]> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxml="urn:schemas-microsoft-com:xslt" xmlns:umbraco.library="urn:umbraco.library" exclude-result-prefixes="msxml umbraco.library"> <xsl:output method="html"/> <xsl:param name="currentPage"/> <xsl:template match="/"> <DIV style="float:bottom; margin: 15px; width=100%;" > <h1>XPath view of your document</h1> <p>The structure of your document (as defined by the XPath standard) is outlined below.</p> <table cellspacing="5" cellpadding="2" border="0"> <tr> <td colspan="7"> <b>Node types:</b> </td> </tr> <tr> <td bgcolor="#99CCCC"><b>root</b></td> <td bgcolor="#CCCC99"><b>element</b></td> <td bgcolor="#FFFF99"><b>attribute</b></td> <td bgcolor="#FFCC99"><b>text</b></td> <td bgcolor="#CCCCFF"><b>comment</b></td> <td bgcolor="#99FF99"><b>processing instruction</b></td> <td bgcolor="#CC99CC"><b>namespace</b></td> </tr> </table> <br /> <table width="100%" border="1" bgcolor="#99CCCC" cellspacing="2"> <tr bgcolor="#99CCCC"> <td colspan="2"> <b>root:</b> </td> </tr> <xsl:for-each select="namespace::*"> <tr bgcolor="#CC99CC"> <td width="15"> </td> <td> <xsl:call-template name="namespace-node"/> </td> </tr> </xsl:for-each> <xsl:for-each select="$currentPage"> <tr bgcolor="#99CCCC"> <td width="15"> </td> <td> <xsl:apply-templates select="."/> </td> </tr> </xsl:for-each> </table> </DIV> </xsl:template> <xsl:template match="comment()"> <table width="100%" cellspacing="2"> <tr> <td bgcolor="#CCCCFF"> <b>comment: </b> <span class="literal"> <xsl:value-of select="."/> </span> </td> </tr> </table> </xsl:template> <xsl:template match="processing-instruction()"> <table border="0" width="100%" cellspacing="2"> <tr> <td bgcolor="#99FF99"> <b>processing instruction: </b> <span class="literal"> <xsl:text><?</xsl:text> <xsl:value-of select="name()"/> <xsl:text>?></xsl:text> <br /> <xsl:value-of select="."/> </span> </td> </tr> </table> </xsl:template> <xsl:template match="text()"> <xsl:if test="string-length(normalize-space(.))"> <tr> <td bgcolor="#CCCC99" width="15"> </td> <td bgcolor="#FFCC99" width="100%"> <b>text: </b> <span class="literal"> <xsl:value-of select="."/> </span> </td> </tr> </xsl:if> </xsl:template> <xsl:template name="namespace-node"> <table border="0" width="100%" cellspacing="2"> <tr> <td bgcolor="#CC99CC"> <b>namespace: </b> <span class="literal"> <xsl:value-of select="name()"/> </span> <br /> <span class="literal"> <xsl:value-of select="."/> </span> </td> </tr> </table> </xsl:template> <xsl:template match="*"> <table border="1" width="100%" cellspacing="2"> <xsl:choose> <xsl:when test="count(@*) > 0"> <tr> <td bgcolor="#CCCC99" colspan="2"> <b>element: </b> <span class="literal"> <xsl:text><</xsl:text> <xsl:value-of select="name()"/> <xsl:text>></xsl:text> </span> <table border="0" width="100%" cellspacing="2"> <tr> <td bgcolor="#CCCC99" width="15"> </td> <td bgcolor="#FFFF99" width="20%"> <b>attribute name</b> </td> <td bgcolor="#FFFF99"> <b>value</b> </td> </tr> <xsl:for-each select="@*"> <tr> <td bgcolor="#CCCC99" width="15"> </td> <td bgcolor="#FFFF99" width="20%"> <span class="literal"> <xsl:value-of select="name()"/> </span> </td> <td bgcolor="#FFFF99"> <span class="literal"> <xsl:value-of select="."/> </span> </td> </tr> </xsl:for-each> </table> </td> </tr> </xsl:when> <xsl:otherwise> <tr> <td bgcolor="#CCCC99" colspan="2"> <b>element: </b> <span class="literal"> <xsl:text><</xsl:text> <xsl:value-of select="name()"/> <xsl:text>></xsl:text> </span> </td> </tr> </xsl:otherwise> </xsl:choose> <xsl:for-each select="namespace::*"> <tr> <td bgcolor="#CCCC99" width="15"> </td> <td bgcolor="#CC99CC"> <xsl:call-template name="namespace-node"/> </td> </tr> </xsl:for-each> <xsl:for-each select="*|comment()|processing-instruction()|text()"> <tr bgcolor="#CCCC99"> <td width="15"> </td> <td> <xsl:apply-templates select="."/> </td> </tr> </xsl:for-each> </table> </xsl:template> </xsl:stylesheet> <!-- fixed version --> <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE xsl:Stylesheet [ <!ENTITY nbsp " "> ]> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxml="urn:schemas-microsoft-com:xslt" xmlns:umbraco.library="urn:umbraco.library" exclude-result-prefixes="msxml umbraco.library"> <xsl:output method="html"/> <xsl:param name="currentPage"/> <xsl:template match="/"> <DIV style="float:bottom; margin: 15px;" > <h1>XPath view of your document</h1> <p>The structure of your document (as defined by the XPath standard) is outlined below.</p> <table cellspacing="5" cellpadding="2" border="0"> <tr> <td colspan="7"> <b>Node types:</b> </td> </tr> <tr> <td bgcolor="#99CCCC"><b>root</b></td> <td bgcolor="#CCCC99"><b>element</b></td> <td bgcolor="#FFFF99"><b>attribute</b></td> <td bgcolor="#FFCC99"><b>text</b></td> <td bgcolor="#CCCCFF"><b>comment</b></td> <td bgcolor="#99FF99"><b>processing instruction</b></td> <td bgcolor="#CC99CC"><b>namespace</b></td> </tr> </table> <br /> <table width="300px" border="2" bgcolor="#99CCCC" cellspacing="2"> <tr bgcolor="#99CCCC"> <td colspan="2"> <b>root:</b> </td> </tr> <xsl:for-each select="namespace::*"> <tr bgcolor="#CC99CC"> <td width="15"> </td> <td> <xsl:call-template name="namespace-node"/> </td> </tr> </xsl:for-each> <xsl:for-each select="$currentPage"> <tr bgcolor="#99CCCC"> <td width="15"> </td> <td> <xsl:apply-templates select="."/> </td> </tr> </xsl:for-each> </table> </DIV> </xsl:template> <xsl:template match="comment()"> <table width="100%" cellspacing="2"> <tr> <td bgcolor="#CCCCFF"> <b>comment: </b> <span class="literal"> <xsl:value-of select="."/> </span> </td> </tr> </table> </xsl:template> <xsl:template match="processing-instruction()"> <table border="0" width="100%" cellspacing="2"> <tr> <td bgcolor="#99FF99"> <b>processing instruction: </b> <span class="literal"> <xsl:text><?</xsl:text> <xsl:value-of select="name()"/> <xsl:text>?></xsl:text> <br /> <xsl:value-of select="."/> </span> </td> </tr> </table> </xsl:template> <xsl:template match="text()"> <xsl:if test="string-length(normalize-space(.))"> <tr> <td bgcolor="#CCCC99" width="15"> </td> <td bgcolor="#FFCC99" width="100%"> <b>text: </b> <span class="literal"> <xsl:value-of select="."/> </span> </td> </tr> </xsl:if> </xsl:template> <xsl:template name="namespace-node"> <table border="0" width="100%" cellspacing="2"> <tr> <td bgcolor="#CC99CC"> <b>namespace: </b> <span class="literal"> <xsl:value-of select="name()"/> </span> <br /> <span class="literal"> <xsl:value-of select="."/> </span> </td> </tr> </table> </xsl:template> <xsl:template match="*"> <table border="1" width="100%" cellspacing="2"> <xsl:choose> <xsl:when test="count(@*) > 0"> <tr> <td bgcolor="#CCCC99" colspan="2"> <b>element: </b> <span class="literal"> <xsl:text><</xsl:text> <xsl:value-of select="name()"/> <xsl:text>></xsl:text> </span> <table border="0" width="100%" cellspacing="2"> <tr> <td bgcolor="#CCCC99" width="15"> </td> <td bgcolor="#FFFF99" width="20%"> <b>attribute name</b> </td> <td bgcolor="#FFFF99"> <b>value</b> </td> </tr> <xsl:for-each select="@*"> <tr> <td bgcolor="#CCCC99" width="15"> </td> <td bgcolor="#FFFF99" width="20%"> <span class="literal"> <xsl:value-of select="name()"/> </span> </td> <td bgcolor="#FFFF99"> <span class="literal"> <xsl:value-of select="."/> </span> </td> </tr> </xsl:for-each> </table> </td> </tr> </xsl:when> <xsl:otherwise> <tr> <td bgcolor="#CCCC99" colspan="2"> <b>element: </b> <span class="literal"> <xsl:text><</xsl:text> <xsl:value-of select="name()"/> <xsl:text>></xsl:text> </span> </td> </tr> </xsl:otherwise> </xsl:choose> <xsl:for-each select="namespace::*"> <tr> <td bgcolor="#CCCC99" width="15"> </td> <td bgcolor="#CC99CC"> <xsl:call-template name="namespace-node"/> </td> </tr> </xsl:for-each> <xsl:for-each select="*|comment()|processing-instruction()|text()"> <tr bgcolor="#CCCC99"> <td width="15"> </td> <td> <xsl:apply-templates select="."/> </td> </tr> </xsl:for-each> </table> </xsl:template> </xsl:stylesheet>