< Umbraco < Samples and Articles < XSLT
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>
This article is issued from Wikibooks. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.