<?xml version="1.0" encoding="iso-8859-1"?> 

<xsl:transform 
     version="1.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
> 
<xsl:output 
  encoding="iso-8859-1" 
  method="html" 
  indent="yes" 
  omit-xml-declaration="yes" 
  doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN" 
/> 

<!-- <xsl:preserve-space elements="code"/> --> 
<xsl:variable name="modelName" select="/DBMODEL/SETTINGS/GLOBALSETTINGS/@ModelName"/> 

<xsl:template match="DBMODEL"> 
  <html> 
  <head> 
    <style> 
      .tableNameHeading { 
           margin-top:2em; 
           margin-bottom:1em; 
           border-top: 2px solid gray; 
           border-bottom: 1px solid #C0C0C0; 
           background-color:#F5F5FF; 
       } 

      .tableComment{ background-color:#e4efff; margin-bottom:20px;} 
      .tableDefinition { padding:2px; border-collapse:collapse; margin-top:1em;} 

      .tdTableDefinition { 
        padding-right:10px; 
        vertical-align:top; 
        border-bottom:1px solid #C0C0C0; 
      } 

      .tdTableHeading { 
        padding:2px; 
        font-weight:bold; 
        vertical-align:top; 
        border-bottom: 1px solid #C0C0C0; 
        background-color: #d0dfff; 
      } 
      
      .subTitle { 
        font-size:115%; 
        font-variant:small-caps; 
        font-weight:bold; 
      } 
    </style> 
  <title><xsl:value-of select="$modelName"/> - Data Model</title> 
  </head> 
  <body> 
    <xsl:apply-templates select="METADATA" mode="body"/> 
  </body> 
  </html> 
</xsl:template> 

<xsl:template match="METADATA" mode="body"> 

    <center><h2><xsl:value-of select="$modelName"/> - Data Model</h2></center> 
    <h3>List of tables</h3> 
    <ul> 
      <xsl:for-each select="TABLES/TABLE"> 
        <xsl:sort select="@Tablename"/> 
        <li> 
          <xsl:variable name="table" select="@Tablename"/> 
          <a href="#{$table}"><xsl:value-of select="$table"/></a> 
        </li> 
      </xsl:for-each> 
    </ul> 
    
    <xsl:for-each select="TABLES/TABLE"> 
    
      <xsl:sort select="@Tablename"/> 
      <xsl:variable name="table" select="@Tablename"/> 
      <xsl:variable name="tableId" select="@ID"/> 

      <div class="tableNameHeading"> 
        <a style="font-size:175%; font-weight:bold; font-family: monospace;" name="{$table}"> 
          <xsl:value-of select="$table"/> 
        </a> 
        <p> 
        <xsl:call-template name="fix-special-chars"> 
          <xsl:with-param name="text" select="@Comments"/> 
        </xsl:call-template> 
        </p> 
      </div> 
      
        
      
      <table class="tableDefinition"> 
        <tr> 
          <td class="tdTableHeading" width="15%">Column</td> 
          <td class="tdTableHeading" width="12%">Type</td> 
          <td class="tdTableHeading" width="3%">PK</td> 
          <td class="tdTableHeading" width="5%">Nullable</td> 
          <td class="tdTableHeading">Comment</td> 
        </tr> 

        <xsl:for-each select="COLUMNS/COLUMN"> 
        
          <tr>  
            <td class="tdTableDefinition"><xsl:value-of select="@ColName"/></td> 
            <td class="tdTableDefinition" nowrap="nowrap">
              <xsl:if test="@AutoInc=1"> 
                SERIAL
              </xsl:if> 
              <xsl:if test="@AutoInc=0"> 
                <xsl:variable name="type_id" select="@idDatatype"/> 
                <xsl:if test="//DATATYPE[@ID=$type_id]/@PhysicalMapping=0"> 
                  <xsl:value-of select="//DATATYPE[@ID=$type_id]/@TypeName"/> 
                </xsl:if> 
                <xsl:if test="//DATATYPE[@ID=$type_id]/@PhysicalMapping=1"> 
                  <xsl:value-of select="//DATATYPE[@ID=$type_id]/@PhysicalTypeName"/> 
                </xsl:if> 
                <xsl:if test="string-length(@DatatypeParams) > 0"> 
                  <xsl:value-of select="@DatatypeParams"/> 
                </xsl:if> 
              </xsl:if> 

            </td> 
            <td class="tdTableDefinition" nowrap="nowrap"> 
              <xsl:if test="@PrimaryKey=1"> 
                <xsl:text>PK</xsl:text> 
              </xsl:if> 
            </td> 
            <td class="tdTableDefinition" nowrap="nowrap"> 
              <xsl:if test="@NotNull=1"> 
                <xsl:text>NOT NULL</xsl:text> 
              </xsl:if> 
            </td> 
            <td class="tdTableDefinition"> 
              <xsl:call-template name="fix-special-chars"> 
                <xsl:with-param name="text" select="@Comments"/> 
              </xsl:call-template> 
            </td> 
          </tr> 
        </xsl:for-each> 
      </table> 
      
      <xsl:if test="count(//RELATION[@SrcTable = $tableId]) > 0"> 
        <p class="subTitle">References</p> 
        <ul> 
        <xsl:for-each select="//RELATION[@SrcTable = $tableId]"> 
          <xsl:variable name="targetID" select="@DestTable"/> 
          <xsl:variable name="targetTable" select="//TABLE[@ID = $targetID]/@Tablename"/> 
            <li><a href="#{$targetTable}"><xsl:value-of select="$targetTable"/></a></li> 
        </xsl:for-each> 
        </ul> 
      </xsl:if>      
      
    </xsl:for-each> 
    
</xsl:template> 

<!-- DbDesigner stores single quotes as \a, double quotes as \A and 
     newlines as \n in the comments field. These special characters 
     need to be removed when outputing to HTML 
-->      
<xsl:template name="fix-special-chars"> 
  <xsl:param name="text"/> 
  <xsl:variable name="step1"> 
    <xsl:call-template name="replace-text"> 
      <xsl:with-param name="text" select="$text"/> 
      <xsl:with-param name="replace" select="'\n'"/> 
      <xsl:with-param name="by" select="'&lt;br&gt;'"/> 
    </xsl:call-template> 
  </xsl:variable>    

  <xsl:variable name="step2"> 
    <xsl:call-template name="replace-text"> 
      <xsl:with-param name="text" select="$step1"/> 
      <xsl:with-param name="replace" select="'\A'"/> 
      <xsl:with-param name="by" select="'&quot;'"/> 
    </xsl:call-template> 
  </xsl:variable> 
  
  <xsl:variable name="step3"> 
    <xsl:call-template name="replace-quotes"> 
      <xsl:with-param name="text" select="$step2"/> 
      <xsl:with-param name="replace" select="'\a'"/> 
    </xsl:call-template> 
  </xsl:variable> 

  <xsl:value-of select="$step3" disable-output-escaping="yes"/> 

</xsl:template> 

<xsl:template name="replace-text"> 
   <xsl:param name="text"/> 
   <xsl:param name="replace" /> 
   <xsl:param name="by"  /> 

   <xsl:choose> 
     <xsl:when test="contains($text, $replace)"> 
        <xsl:value-of select="substring-before($text, $replace)"/> 
        <xsl:value-of select="$by" disable-output-escaping="yes"/> 
        <xsl:call-template name="replace-text"> 
           <xsl:with-param name="text" select="substring-after($text, $replace)"/> 
           <xsl:with-param name="replace" select="$replace" /> 
           <xsl:with-param name="by" select="$by" /> 
        </xsl:call-template> 
     </xsl:when> 
     <xsl:otherwise> 
        <xsl:value-of select="$text"/> 
     </xsl:otherwise> 
   </xsl:choose> 
    
</xsl:template> 

<!-- A single quote cannot be processed like replace-text does it. 
     It can only be written into the output by using the text tag 
     so we have a special treatment for single quotes here 
-->      
<xsl:template name="replace-quotes"> 
   <xsl:param name="text"/> 
   <xsl:param name="replace" /> 

   <xsl:choose> 
     <xsl:when test="contains($text, $replace)"> 
        <xsl:value-of select="substring-before($text, $replace)"/> 
        <xsl:text>'</xsl:text> 
        <xsl:call-template name="replace-quotes"> 
           <xsl:with-param name="text" select="substring-after($text, $replace)"/> 
           <xsl:with-param name="replace" select="$replace" /> 
        </xsl:call-template> 
     </xsl:when> 
     <xsl:otherwise> 
        <xsl:value-of select="$text"/> 
     </xsl:otherwise> 
   </xsl:choose> 
    
</xsl:template> 

</xsl:transform>  

