<!--

   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:verb="http://informatik.hu-berlin.de/xmlverbatim" xmlns:xd="http://www.pnp-software.com/XSLTdoc" version="1.0" exclude-result-prefixes="verb">



   
<xsl:output name="xhtml" omit-xml-declaration="no" method="xhtml" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" indent="no" encoding="UTF-8" />



   
<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="'   '" />

      
<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">

         
<a name="{generate-id(.)}"><xsl:value-of select="local-name()" /></a>

      
</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