<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE xsl:stylesheet [
<!ENTITY nbsp "&#160;">
]>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0">
<xsl:output encoding="ISO-8859-1" indent="yes" method="html" xml:space="preserve"/>
    
    <xsl:template match="*"/>
    
    <xsl:template match="/">
        <html>
            <head>
                <style type="text/css">
                    .tag { color: #663333; font-weight: bold; }
                    .attr { color: #003366; font-weight: bold; }
                    .value { color: #993366; font-weight: normal; }
                    .comment { color: #666666; font-weight: normal; }
                </style>
            </head>
            <body>
                <p>
        <xsl:for-each select="*">
            <xsl:call-template name="writeNode">
                <xsl:with-param name="n" select="."/>
                <xsl:with-param name="level">1</xsl:with-param>
            </xsl:call-template>
        </xsl:for-each>
                </p>
            </body>
        </html>
    </xsl:template>
    
    <xsl:template name="writeNode">
        <xsl:param name="n"/>
        <xsl:param name="level"/>
        <xsl:variable name="tagName">
            <xsl:value-of select="name()"/>
        </xsl:variable>
        
        <br/>
        <xsl:call-template name="blankString"><xsl:with-param name="length" select="$level"/></xsl:call-template>
        <span class="tag"><xsl:text disable-output-escaping="yes"><![CDATA[&lt;]]></xsl:text><xsl:value-of select="$tagName"/></span>
        <xsl:for-each select="@*">
            <xsl:call-template name="writeAttribute"><xsl:with-param name="a" select="."/></xsl:call-template>
        </xsl:for-each>
        <xsl:choose>
            <xsl:when test="count(*|text()) &gt; 0">
                <span class="tag"><xsl:text disable-output-escaping="yes"><![CDATA[&gt;]]></xsl:text></span>
                <xsl:for-each select="*">
                    <xsl:call-template name="writeNode">
                        <xsl:with-param name="n" select="."/>
                        <xsl:with-param name="level" select="$level + 1"/>
                    </xsl:call-template>
                </xsl:for-each>
                <xsl:for-each select="text()">
                    <xsl:value-of select="normalize-space(.)"/>
                </xsl:for-each>
                <br/><xsl:call-template name="blankString"><xsl:with-param name="length" select="$level"/></xsl:call-template>
                <span class="tag"><xsl:text disable-output-escaping="yes"><![CDATA[&lt;/]]></xsl:text><xsl:value-of select="$tagName"/><xsl:text disable-output-escaping="yes"><![CDATA[&gt;]]></xsl:text></span>
            </xsl:when>
            <xsl:otherwise><span class="tag"><xsl:text disable-output-escaping="yes"><![CDATA[ /&gt;]]></xsl:text></span></xsl:otherwise>
        </xsl:choose>
    </xsl:template>
    
    <!--xsl:template name="writeChild">
        <xsl:param name="n"/>
        <xsl:param name="level" select="1"/>
        @<xsl:value-of select="local-name($n)"/>@
        <xsl:choose>
            <xsl:when test="string-length(normalize-space(local-name($n))) = 0 and string-length($n) &gt; 0"><xsl:call-template name="blankString"><xsl:with-param name="length" select="$level"/></xsl:call-template><span class="comment"><xsl:value-of select="$n/text()"/></span></xsl:when>
            <xsl:otherwise><xsl:call-template name="writeNode"><xsl:with-param name="level" select="$level"/><xsl:with-param name="n" select="."/></xsl:call-template></xsl:otherwise>
        </xsl:choose>
     </xsl:template-->
            
    
    <xsl:template name="writeAttribute">
        <xsl:param name="a"/>
        <xsl:text>&nbsp;</xsl:text>
        <span class="attr"><xsl:value-of select="name()"/><xsl:text>=</xsl:text></span>
        <span class="value">
            <xsl:choose>
                <xsl:when test="name(.) = 'schemaLocation'">
                    <xsl:element name="a">
                        <xsl:attribute name="href"><xsl:value-of select="."/></xsl:attribute>"<xsl:value-of select="."/>"
                    </xsl:element>
                </xsl:when>
                <xsl:otherwise>"<xsl:value-of select="."></xsl:value-of>"</xsl:otherwise>
            </xsl:choose>
            
            
        </span>
    </xsl:template>

    <xsl:template name="blankString">
        <xsl:param name="length"/>
        <xsl:variable name="mavar" select="string('&nbsp;&nbsp;')"/>
        <xsl:call-template name="dup">
            <xsl:with-param name="input" select="string($mavar)"/>
            <xsl:with-param name="count" select="$length"/>
        </xsl:call-template>
    </xsl:template>
    
    <xsl:template name="dup">
        <xsl:param name="input"/>
        <xsl:param name="count" select="2"/>
        <xsl:choose>
            <xsl:when test="not($count) or not($input)"/>
            <xsl:when test="$count = 1">
                <xsl:value-of select="$input"/>
            </xsl:when>
            <xsl:otherwise>
                <!-- if $count is an odd append extra copy of $input -->
                <xsl:if test="$count mod 2">
                    <xsl:value-of select="$input"/>
                </xsl:if>
                <xsl:call-template name="dup">
                    <xsl:with-param name="input" select="concat($input,$input)"/>
                    <xsl:with-param name="count" select="floor($count div 2)"/>
                </xsl:call-template>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
    
</xsl:stylesheet>
