<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:saxon="http://icl.com/saxon"
                exclude-result-prefixes="saxon" version="1.0">

  <xsl:output method="html" encoding="utf-8" indent="yes"/>

  <xsl:preserve-space elements="*"/>

  <xsl:param name="title" select="'XSL Stylesheet'"/>

  <xsl:template match="/">
    <html>
      <head>
	<title><xsl:value-of select="$title"/></title>
	<link rel="stylesheet" type="text/css" href="../colorize.css"/>
      </head>
      <body>
	<pre>
	  <xsl:apply-templates/>
	</pre>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="*">
    <span class="markup">
      <xsl:text><</xsl:text>
    </span>
    <span class="start">
      <xsl:copy-of select="name(.)"/>
    </span>

    <xsl:if test="not(parent::*)">
      <xsl:for-each select="namespace::*">
	<xsl:if test="local-name(.) != 'xml'">
	  <span class="attr">
	    <xsl:choose>
	      <xsl:when test="local-name(.) = ''"> xmlns</xsl:when>
	      <xsl:otherwise>
		<xsl:text> xmlns:</xsl:text>
		<xsl:value-of select="local-name(.)"/>
	      </xsl:otherwise>
	    </xsl:choose>
	  </span>
	  <xsl:text>="</xsl:text>
	  <span class="attrvalue">
	    <xsl:value-of select="."/>
	  </span>
	  <xsl:text>"
               </xsl:text>
	</xsl:if>
      </xsl:for-each>
    </xsl:if>

    <xsl:for-each select="@*">
      <xsl:text> </xsl:text>
      <span class="attr">
	<xsl:value-of select="name(.)"/>
      </span>
      <xsl:text>=</xsl:text>
      <xsl:choose>
	<xsl:when test='contains(., '"')'>'</xsl:when>
	<xsl:otherwise>"</xsl:otherwise>
      </xsl:choose>
      <span class="attrvalue">
	<xsl:value-of select="."/>
      </span>
      <xsl:choose>
	<xsl:when test='contains(., '"')'>'</xsl:when>
	<xsl:otherwise>"</xsl:otherwise>
      </xsl:choose>
    </xsl:for-each>

    <xsl:choose>
      <xsl:when test="not(*) and . = ''">
	<span class="markup">
	  <xsl:text>/></xsl:text>
	</span>
      </xsl:when>
      <xsl:otherwise>
	<span class="markup">
	  <xsl:text>></xsl:text>
	</span>
	<xsl:apply-templates/>
	<span class="markup">
	  <xsl:text><</xsl:text>
	</span>
	<span class="end">
	  <xsl:text>/</xsl:text>
	  <xsl:copy-of select="name(.)"/>
	</span>
	<span class="markup">
	  <xsl:text>></xsl:text>
	</span>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <xsl:template match="text()">
    <span class="text">
      <xsl:choose>
	<xsl:when test="parent::*/*">
	  <xsl:value-of select="."/>
	</xsl:when>
	<xsl:when test=". = '

'">
	  <span class="markup">&#10;&#10;</span>
	</xsl:when>
	<xsl:when test=". = '
'">
	  <span class="markup">&#10;</span>
	</xsl:when>
	<xsl:otherwise>
	  <xsl:value-of select="."/>
	</xsl:otherwise>
      </xsl:choose>
    </span>
  </xsl:template>

  <xsl:template match="comment()">
    <span class="comment">
      <xsl:text><--</xsl:text>
      <xsl:value-of select="."/>
      <xsl:text>-->
</xsl:text>
    </span>
  </xsl:template>

  <xsl:template match="processing-instruction()">
    <span class="pi">
      <xsl:if test="name(.) != 'xml-stylesheet'">
	<xsl:text><?</xsl:text>
	<xsl:value-of select="name(.)"/>
	<xsl:text> </xsl:text>
	<xsl:value-of select="."/>
	<xsl:text>?></xsl:text>
      </xsl:if>
    </span>
  </xsl:template>
</xsl:stylesheet>