<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="/pool/xslt_ht.xslt" type="application/xml"?>
<xsl:stylesheet
  xmlns = "http://www.w3.org/1999/xhtml"
  xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
  xmlns:xsa = "xsl/alias"
  xmlns:d = "http://herbaer.de/xmlns/20051201/doc"
  xmlns:dd = "http://herbaer.de/xmlns/20201201/dbdump"
  xmlns:dc = "http://herbaer.de/xmlns/20201201/dbcontents/$HB_DBNAME"
  xmlns:xl = "http://www.w3.org/1999/xlink"
  version = "1.0"
  exclude-result-prefixes = "dd xl"
>
<!--
  Vorlage zur HTML-Ansicht aus Datenbank-Dump
  2020-12-04 Herbert Schiemann <h.schiemann@herbaer.de>
  Borkener Str. 167, 46284 Dorsten, Deutschland
  GPL Version 2 oder neuer
  Jede Gewährleistung ist ausgeschlossen.
-->
<d:info xmlns="http://herbaer.de/xmlns/20051201/doc">
  <title>dump_htview.xslt</title>
  <subtitle>Vorlage zur HTML-Ansicht aus Datenbank-Dump</subtitle>
  <date>2020-12-04</date>
  <author>
    <personname>
      <firstname>Herbert</firstname>
      <surname>Schiemann</surname>
    </personname>
    <email>h.schiemann@herbaer.de</email>
  </author>
</d:info>

<d:para role="stylesheet">
Diese Transformation erzeugt aus einem Datenbank-Dump
eine XSLT-Datei zur HTML-Ansicht des Datenbank-Dump.
XML-Namensräume für XSLT 1.0 mehr oder weniger fest vorgegeben.
In der Ausgabedatei ist daher noch der Platzhalter
<d:replaceable>$HB_DBNAME</d:replaceable> durch den Namen der Datenbank
zu ersetzen.
</d:para>

<d:para>
Das Namensraumpräfix <tag class="prefix">xsa</tag> steht für den Namensraum
<uri type="xmlnamespace">http://www.w3.org/1999/XSL/Transform</uri> in der Ausgabe.
</d:para>
<xsl:namespace-alias stylesheet-prefix="xsa" result-prefix="xsl"/>

<d:para>Erstellungszeit</d:para>
<xsl:param name="p_date"/>

<d:para>Stylesheet-Anweisung in der Ausgabe</d:para>
<xsl:param name="p_xslt" select="'../../pool/xslt_ht.xslt'"/>

<d:para>Vorlagen für einzelne Werte ausgeben: yes/no</d:para>
<xsl:param name="p_valuetemplates" select="'no'"/>

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

<d:para>Wurzelelement</d:para>
<xsl:template match="/dd:dbdump">
  <xsl:variable name="dbname" select="dd:dbname"/>
  <xsl:if test="string-length ($p_xslt) &gt; 0">
    <xsl:processing-instruction name="xml-stylesheet">
      <xsl:text>href="</xsl:text>
      <xsl:value-of select="$p_xslt"/>
      <xsl:text>" type="application/xml"</xsl:text>
    </xsl:processing-instruction>
  </xsl:if>
  <xsa:stylesheet version="1.0">
    <d:info xmlns="http://herbaer.de/xmlns/20051201/doc">
      <title>
        <xsl:value-of select="$dbname"/>
        <xsl:text>_ht.xslt</xsl:text>
      </title>
      <subtitle>
        <xsl:text>HTML-Ansicht der Datenbank </xsl:text>
        <xsl:value-of select="$dbname"/>
      </subtitle>
      <xsl:if test="string-length ($p_date) &gt; 0">
        <date><xsl:value-of select="$p_date"/></date>
      </xsl:if>
      <annotation>
        <para>
Automatisch erzeugt von <filename>KLEIDER/catalog/src/dbdump/dump_htview.xslt</filename>
        </para>
      </annotation>
    </d:info>
    <xsa:include href="../src/dbdump/dump_htinc.xslt"/>
    <xsa:template match="dc:{$dbname}">
      <!-- Datenbank-Tabellen -->
      <xsl:apply-templates select="dd:table" mode="ref"/>
    </xsa:template>
    <xsl:apply-templates select="dd:table" mode="templ"/>
    <xsl:if test="$p_valuetemplates != 'yes'">
      <xsa:template match="dc:*">
        <xsa:value-of select="."/>
      </xsa:template>
    </xsl:if>
  </xsa:stylesheet>
</xsl:template>

<d:para>
Vorlagen für Tabellen anwenden
</d:para>
<xsl:template match="dd:dbdump/dd:table" mode="ref">
  <xsl:variable name="tnam" select="dd:tabname"/>
  <xsa:if test="dc:{$tnam}">
    <div>
      <xsl:attribute name="id">div_tab_<xsl:value-of select="$tnam"/></xsl:attribute>
      <h2>
        <xsl:choose>
          <xsl:when test="dd:comment">
            <xsl:value-of select="dd:comment"/>
          </xsl:when>
          <xsl:otherwise>
            <xsl:text>Tabelle </xsl:text>
            <xsl:value-of select="$tnam"/>
          </xsl:otherwise>
        </xsl:choose>
      </h2>
      <table class="tabsort">
        <xsl:attribute name="id">tab_<xsl:value-of select="$tnam"/></xsl:attribute>
        <thead>
          <tr>
            <xsl:apply-templates select="dd:field" mode="thead"/>
          </tr>
        </thead>
        <tbody>
          <xsa:apply-templates select="dc:{$tnam}"/>
        </tbody>
      </table>
    </div>
  </xsa:if>
</xsl:template>

<d:para>
Attribut <d:tag class="attribute">class</d:tag> einer Tabellen-Zelle
(eines Datenbankfeldes).
Das erste Wort ist ein Datentyp,
das zweite Wort ein Datentyp-Hinweis für die Sortierung
(s.<d:filename>tabsort.js</d:filename>).
</d:para>
<xsl:template match="dd:table/dd:field" mode="class">
  <xsl:variable name="tp" select="dd:type"/>
  <xsl:variable name="cls">
    <xsl:choose>
      <xsl:when test="starts-with ($tp, 'bool')">boolean text</xsl:when>
      <xsl:when test="starts-with ($tp, 'tinyint')">integer number</xsl:when>
      <xsl:when test="starts-with ($tp, 'smallint')">integer number</xsl:when>
      <xsl:when test="starts-with ($tp, 'mediumint')">integer number</xsl:when>
      <xsl:when test="starts-with ($tp, 'int')">integer number</xsl:when>
      <xsl:when test="starts-with ($tp, 'bigint')">integer number</xsl:when>
      <xsl:when test="starts-with ($tp, 'dec')    or starts-with
      ($tp, 'numeric')    or starts-with
      ($tp, 'fixed')    or starts-with
      ($tp, 'number')">decimal number</xsl:when>
      <xsl:when test="starts-with ($tp, 'float')">number</xsl:when>
      <xsl:when test="starts-with ($tp, 'double')">number</xsl:when>
      <xsl:when test="starts-with ($tp, 'bit')">bitfield</xsl:when>
      <xsl:when test="starts-with ($tp, 'binary')">binary text</xsl:when>
      <xsl:when test="starts-with ($tp, 'datetime')">datetime date</xsl:when>
      <xsl:when test="starts-with ($tp, 'timestamp')">datetime date</xsl:when>
      <xsl:when test="starts-with ($tp, 'date')">date</xsl:when>
      <xsl:when test="starts-with ($tp, 'time')">time text</xsl:when>
      <xsl:when test="starts-with ($tp, 'year')">year number</xsl:when>
      <xsl:when test="contains ($tp, 'blob')">blob text</xsl:when>
      <xsl:otherwise>text</xsl:otherwise>
    </xsl:choose>
  </xsl:variable>
  <xsl:if test="string-length($cls) &gt; 0">
    <xsl:attribute name="class">
      <xsl:value-of select="$cls"/>
    </xsl:attribute>
  </xsl:if>
</xsl:template>

<d:para>
Spaltenüberschriften
</d:para>
<xsl:template match="dd:table/dd:field" mode="thead">
  <td>
    <xsl:apply-templates select="." mode="class"/>
    <xsl:choose>
      <xsl:when test="dd:label">
        <xsl:value-of select="dd:label"/>
      </xsl:when>
      <xsl:when test="dd:comment">
        <xsl:value-of select="dd:comment"/>
      </xsl:when>
      <xsl:when test="dd:name">
        <xsl:value-of select="dd:name"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="concat ('(', position(), ')')"/>
      </xsl:otherwise>
    </xsl:choose>
  </td>
</xsl:template>

<d:para>
Vorlage für Tabelle definieren
</d:para>
<xsl:template match="dd:dbdump/dd:table" mode="templ">
  <xsa:template match="dc:{dd:tabname}">
    <tr>
      <xsl:apply-templates select="dd:field" mode="tbody"/>
    </tr>
  </xsa:template>
  <xsl:if test="$p_valuetemplates = 'yes'">
    <xsl:apply-templates select="dd:field" mode="value">
      <xsl:with-param name="tnam" select="dd:tabname"/>
    </xsl:apply-templates>
  </xsl:if>
</xsl:template>

<d:para>
Ein Datenbankfeld in der Tabelle
</d:para>
<xsl:template match="dd:table/dd:field" mode="tbody">
  <td>
    <xsl:apply-templates select="." mode="class"/>
    <xsa:apply-templates select="dc:{dd:name}"/>
  </td>
</xsl:template>

<d:para>
Inhalt eines Datenbankfeldes
</d:para>
<xsl:template match="dd:table/dd:field" mode="value">
  <!-- Tabellenname -->
  <xsl:param name="tnam"/>
  <xsl:if test="dd:type | dd:label | dd:comment">
    <d:para>
      <xsl:if test="dd:type">
        <xsl:text>Datentyp: </xsl:text>
        <xsl:value-of select="dd:type"/>
        <xsl:if test="dd:label | dd:comment">,</xsl:if>
        <xsl:text>
</xsl:text>
      </xsl:if>
      <xsl:if test="dd:label">
        <xsl:value-of select="dd:label"/>
        <xsl:if test="dd:comment">,</xsl:if>
        <xsl:text>
</xsl:text>
      </xsl:if>
      <xsl:if test="dd:comment">
        <xsl:value-of select="dd:comment"/>
        <xsl:text>
</xsl:text>
      </xsl:if>
    </d:para>
  </xsl:if>
  <xsa:template match="dc:{$tnam}/dc:{dd:name}">
    <xsa:value-of select="."/>
  </xsa:template>
</xsl:template>

</xsl:stylesheet>
