<!--
   XML to HTML Verbatim Formatter with Syntax Highlighting
   Version 1.1
   LGPL (c) Oliver Becker, 2002-08-22
   obecker@informatik.hu-berlin.de
   Contributors: Doug Dicks, added auto-indent (parameter indent-elements)
                 for pretty-print
-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xd="http://www.pnp-software.com/XSLTdoc" xmlns:verb="http://informatik.hu-berlin.de/xmlverbatim" version="1.0" exclude-result-prefixes="verb">

   
<xsl:output method="html" omit-xml-declaration="yes" indent="no" />

   
<xsl:param name="indent-elements" select="false()" />

   
<!-- root -->
   
<xsl:template match="/" mode="xmlverb">
      
<xsl:text>
</xsl:text>
      
<xsl:comment>
         
<xsl:text> converted by xmlverbatim.xsl 1.1, (c) O. Becker </xsl:text>
      
</xsl:comment>
      
<xsl:text>
</xsl:text>
      
<div class="xmlverb-default">
         
<xsl:apply-templates mode="xmlverb">
            
<xsl:with-param name="indent-elements" select="$indent-elements" />
         
</xsl:apply-templates>
      
</div>
      
<xsl:text>
</xsl:text>
   
</xsl:template>

   
<!-- wrapper -->
   
<xsl:template match="verb:wrapper">
      
<xsl:apply-templates mode="xmlverb">
         
<xsl:with-param name="indent-elements" select="$indent-elements" />
      
</xsl:apply-templates>
   
</xsl:template>

   
<xsl:template match="verb:wrapper" mode="xmlverb">
      
<xsl:apply-templates mode="xmlverb">
         
<xsl:with-param name="indent-elements" select="$indent-elements" />
      
</xsl:apply-templates>
   
</xsl:template>
  
   
<xsl:template match="*" mode="xmlverb">
     
<xsl:param name="indent-elements" select="false()" />
      
<xsl:param name="indent" select="''" />
      
<xsl:param name="indent-increment" select="'   '" /> 
     
<xsl:choose>
       
<xsl:when test="self::xd:doc">
         
<div class="xd">
           
<!-- Fix indentation (dublicate, because indentation needs to be inside the div tag) -->
           
<xsl:value-of select="translate(preceding-sibling::text()[last()],' ',' ')" />
           
<xsl:apply-templates select="self::*" mode="xmlverb_1">
              
<xsl:with-param name="indent-elements" select="$indent-elements" />
              
<xsl:with-param name="indent" select="concat($indent, $indent-increment)" />
              
<xsl:with-param name="indent-increment" select="$indent-increment" />
           
</xsl:apply-templates>
         
</div>
       
</xsl:when>
       
<xsl:otherwise><xsl:apply-templates select="self::*" mode="xmlverb_1">
              
<xsl:with-param name="indent-elements" select="$indent-elements" />
              
<xsl:with-param name="indent" select="concat($indent, $indent-increment)" />
              
<xsl:with-param name="indent-increment" select="$indent-increment" />
           
</xsl:apply-templates></xsl:otherwise>
     
</xsl:choose>
   
</xsl:template>

   
<!-- element nodes -->
   
<xsl:template match="*" mode="xmlverb_1">
      
<xsl:param name="indent-elements" select="false()" />
      
<xsl:param name="indent" select="''" />
      
<xsl:param name="indent-increment" select="'   '" />
      
<a name="{generate-id(.)}" />
      
<xsl:if test="$indent-elements">
         
<br />
         
<xsl:value-of select="$indent" />
      
</xsl:if>
      
<xsl:text>&lt;</xsl:text>
      
<xsl:variable name="ns-prefix" select="substring-before(name(),':')" />
      
<xsl:if test="$ns-prefix != ''">
         
<span class="xmlverb-element-nsprefix">
            
<xsl:value-of select="$ns-prefix" />
         
</span>
         
<xsl:text>:</xsl:text>
      
</xsl:if>
      
<span class="xmlverb-element-name">
         
<xsl:value-of select="local-name()" />
      
</span>
      
<xsl:variable name="pns" select="../namespace::*" />
      
<xsl:if test="$pns[name()=''] and not(namespace::*[name()=''])">
         
<span class="xmlverb-ns-name">
            
<xsl:text> xmlns</xsl:text>
         
</span>
         
<xsl:text>=""</xsl:text>
      
</xsl:if>
      
<xsl:for-each select="namespace::*">
         
<xsl:if test="not($pns[name()=name(current()) and .=current()])">
            
<xsl:call-template name="xmlverb-ns" />
         
</xsl:if>
      
</xsl:for-each>
      
<xsl:for-each select="@*">
         
<xsl:call-template name="xmlverb-attrs" />
      
</xsl:for-each>
      
<xsl:choose>
         
<xsl:when test="node()">
            
<xsl:text>&gt;</xsl:text>
            
<xsl:apply-templates mode="xmlverb">
              
<xsl:with-param name="indent-elements" select="$indent-elements" />
              
<xsl:with-param name="indent" select="concat($indent, $indent-increment)" />
              
<xsl:with-param name="indent-increment" select="$indent-increment" />
            
</xsl:apply-templates>
            
<xsl:if test="* and $indent-elements">
               
<br />
               
<xsl:value-of select="$indent" />
            
</xsl:if>
            
<xsl:text>&lt;/</xsl:text>
            
<xsl:if test="$ns-prefix != ''">
               
<span class="xmlverb-element-nsprefix">
                  
<xsl:value-of select="$ns-prefix" />
               
</span>
               
<xsl:text>:</xsl:text>
            
</xsl:if>
            
<span class="xmlverb-element-name">
               
<xsl:value-of select="local-name()" />
            
</span>
            
<xsl:text>&gt;</xsl:text>
         
</xsl:when>
         
<xsl:otherwise>
            
<xsl:text> /&gt;</xsl:text>
         
</xsl:otherwise>
      
</xsl:choose>
      
<xsl:if test="not(parent::*)"><br /><xsl:text>
</xsl:text></xsl:if>
   
</xsl:template>

   
<!-- attribute nodes -->
   
<xsl:template name="xmlverb-attrs">
      
<xsl:text> </xsl:text>
      
<span class="xmlverb-attr-name">
         
<xsl:value-of select="name()" />
      
</span>
      
<xsl:text>="</xsl:text>
      
<span class="xmlverb-attr-content">
         
<xsl:call-template name="html-replace-entities">
            
<xsl:with-param name="text" select="normalize-space(.)" />
            
<xsl:with-param name="attrs" select="true()" />
         
</xsl:call-template>
      
</span>
      
<xsl:text>"</xsl:text>
   
</xsl:template>

   
<!-- namespace nodes -->
   
<xsl:template name="xmlverb-ns">
      
<xsl:if test="name()!='xml'">
         
<span class="xmlverb-ns-name">
            
<xsl:text> xmlns</xsl:text>
            
<xsl:if test="name()!=''">
               
<xsl:text>:</xsl:text>
            
</xsl:if>
            
<xsl:value-of select="name()" />
         
</span>
         
<xsl:text>="</xsl:text>
         
<span class="xmlverb-ns-uri">
            
<xsl:value-of select="." />
         
</span>
         
<xsl:text>"</xsl:text>
      
</xsl:if>
   
</xsl:template>

   
<!-- text nodes -->
   
<xsl:template match="text()" mode="xmlverb">
      
<span class="xmlverb-text">
         
<xsl:call-template name="preformatted-output">
            
<xsl:with-param name="text">
               
<xsl:call-template name="html-replace-entities">
                  
<xsl:with-param name="text" select="." />
               
</xsl:call-template>
            
</xsl:with-param>
         
</xsl:call-template>
      
</span>
   
</xsl:template>

   
<!-- comments -->
   
<xsl:template match="comment()" mode="xmlverb">
      
<xsl:text>&lt;!--</xsl:text>
      
<span class="xmlverb-comment">
         
<xsl:call-template name="preformatted-output">
            
<xsl:with-param name="text" select="." />
         
</xsl:call-template>
      
</span>
      
<xsl:text>--&gt;</xsl:text>
      
<xsl:if test="not(parent::*)"><br /><xsl:text>
</xsl:text></xsl:if>
   
</xsl:template>

   
<!-- processing instructions -->
   
<xsl:template match="processing-instruction()" mode="xmlverb">
      
<xsl:text>&lt;?</xsl:text>
      
<span class="xmlverb-pi-name">
         
<xsl:value-of select="name()" />
      
</span>
      
<xsl:if test=".!=''">
         
<xsl:text> </xsl:text>
         
<span class="xmlverb-pi-content">
            
<xsl:value-of select="." />
         
</span>
      
</xsl:if>
      
<xsl:text>?&gt;</xsl:text>
      
<xsl:if test="not(parent::*)"><br /><xsl:text>
</xsl:text></xsl:if>
   
</xsl:template>


   
<!-- =========================================================== -->
   
<!--                    Procedures / Functions                   -->
   
<!-- =========================================================== -->

   
<!-- generate entities by replacing &, ", < and > in $text -->
   
<xsl:template name="html-replace-entities">
      
<xsl:param name="text" />
      
<xsl:param name="attrs" />
      
<xsl:variable name="tmp">
         
<xsl:call-template name="replace-substring">
            
<xsl:with-param name="from" select="'&gt;'" />
            
<xsl:with-param name="to" select="'&amp;gt;'" />
            
<xsl:with-param name="value">
               
<xsl:call-template name="replace-substring">
                  
<xsl:with-param name="from" select="'&lt;'" />
                  
<xsl:with-param name="to" select="'&amp;lt;'" />
                  
<xsl:with-param name="value">
                     
<xsl:call-template name="replace-substring">
                        
<xsl:with-param name="from" select="'&amp;'" />
                        
<xsl:with-param name="to" select="'&amp;amp;'" />
                        
<xsl:with-param name="value" select="$text" />
                     
</xsl:call-template>
                  
</xsl:with-param>
               
</xsl:call-template>
            
</xsl:with-param>
         
</xsl:call-template>
      
</xsl:variable>
      
<xsl:choose>
         
<!-- $text is an attribute value -->
         
<xsl:when test="$attrs">
            
<xsl:call-template name="replace-substring">
               
<xsl:with-param name="from" select="' '" />
               
<xsl:with-param name="to" select="'&amp;#xA;'" />
               
<xsl:with-param name="value">
                  
<xsl:call-template name="replace-substring">
                     
<xsl:with-param name="from" select="'&quot;'" />
                     
<xsl:with-param name="to" select="'&amp;quot;'" />
                     
<xsl:with-param name="value" select="$tmp" />
                  
</xsl:call-template>
               
</xsl:with-param>
            
</xsl:call-template>
         
</xsl:when>
         
<xsl:otherwise>
            
<xsl:value-of select="$tmp" />
         
</xsl:otherwise>
      
</xsl:choose>
   
</xsl:template>

   
<!-- replace in $value substring $from with $to -->
   
<xsl:template name="replace-substring">
      
<xsl:param name="value" />
      
<xsl:param name="from" />
      
<xsl:param name="to" />
      
<xsl:choose>
         
<xsl:when test="contains($value,$from)">
            
<xsl:value-of select="substring-before($value,$from)" />
            
<xsl:value-of select="$to" />
            
<xsl:call-template name="replace-substring">
               
<xsl:with-param name="value" select="substring-after($value,$from)" />
               
<xsl:with-param name="from" select="$from" />
               
<xsl:with-param name="to" select="$to" />
            
</xsl:call-template>
         
</xsl:when>
         
<xsl:otherwise>
            
<xsl:value-of select="$value" />
         
</xsl:otherwise>
      
</xsl:choose>
   
</xsl:template>

   
<!-- preformatted output: space as &nbsp;, tab as 8 &nbsp;
                             nl as <br> 
-->
   
<xsl:template name="preformatted-output">
      
<xsl:param name="text" />
      
<xsl:call-template name="output-nl">
         
<xsl:with-param name="text">
            
<xsl:call-template name="replace-substring">
               
<xsl:with-param name="value" select="translate($text,' ',' ')" />
               
<xsl:with-param name="from" select="' '" />
               
<xsl:with-param name="to" select="'        '" />
            
</xsl:call-template>
         
</xsl:with-param>
      
</xsl:call-template>
   
</xsl:template>

   
<!-- output nl as <br> -->
   
<xsl:template name="output-nl">
      
<xsl:param name="text" />
      
<xsl:choose>
         
<xsl:when test="contains($text,' ')">
            
<xsl:value-of select="substring-before($text,' ')" />
            
<br />
            
<xsl:text>
</xsl:text>
            
<xsl:call-template name="output-nl">
               
<xsl:with-param name="text" select="substring-after($text,' ')" />
            
</xsl:call-template>
         
</xsl:when>
         
<xsl:otherwise>
            
<xsl:value-of select="$text" />
         
</xsl:otherwise>
      
</xsl:choose>
   
</xsl:template>

</xsl:stylesheet>






































v