<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="/pool/xslt_ht.xslt" type="application/xml"?>
<xsl:stylesheet
  xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
  xmlns:db = "http://docbook.org/ns/docbook"
  xmlns:ht = "http://www.w3.org/1999/xhtml"
  xmlns:d = "http://herbaer.de/xmlns/20051201/doc"
  xmlns:e = "http://herbaer.de/xmlns/20120911/embed"
  xmlns:hsh = "http://herbaer.de/xmlns/20121015/hash"
  xmlns:xl = "http://www.w3.org/1999/xlink"
  xmlns = "http://www.w3.org/1999/xhtml"
  exclude-result-prefixes = "d db ht xl hsh"
  version = "1.0"
>
<xsl:import href="../../../docbook_xsl/xhtml5/docbook.xsl"/>

<d:info xmlns="http://herbaer.de/xmlns/20051201/doc">
  <title>index_dbk_ht.xslt</title>
  <subtitle>Einfache XHTML-Darstellung</subtitle>
  <date>2012-09-13</date>
  <author>
    <personname>
      <firstname>Herbert</firstname>
      <surname>Schiemann</surname>
    </personname>
    <email>h.schiemann@herbaer.de</email>
  </author>
</d:info>

<d:section xmlns="http://herbaer.de/xmlns/20051201/doc" role="stylesheet">
<para>
Bisher wurde aus dem DocBook-Quelltext der Startseite ein XHTML-Dokument erzeugt,
das mit Javascript und CSS-Regeln im Browser dargestellt wurde.
</para>
<para>
Jetzt überlasse ich dem Browser mehr Arbeit:
Diese Transformation erzeugt ein einfaches XHTML-Dokument.
Der Browser wendet darauf eine XSLT-Transformation an,
die die zur Darstellung nötigen zusätzlichen Elemente erzeugt,
insbesondere den "Navigationsbaum".
Die XSLT-Transformation bindet auch die Javascript-Dateien und CSS-Regeln ein.
</para>
<para>
Es muss möglich sein, im Quelltext die Abschnitte,
zu denen ein Eintrag im Navigationsbaum erzeugt werden soll, zu kennzeichnen.
Ohne weitere Attribute wird aus einem <tag class="element">section</tag>-Element
ein <tag class="element">div</tag>-XHTML-Element, dessen  Attribut
<tag class="attribute">class</tag> mit "<literal>section</literal>" beginnt.
Wenn das <tag class="attribute">class</tag>-Attribut der
übergeordneten <tag class="element">div</tag>-Elemente ebenfalls mit
"<literal>section</literal>" beginnt, wird es in den Navigationsbaum aufgenommen.
Das Wort "<literal>hb_no_navig</literal>" im Attribut <tag class="attribute">role</tag>
eines <tag class="element">section</tag>-Elements unterbindet das Wort
"<literal>section</literal>" am Anfang des <tag class="attribute">class</tag>-Attributs.
</para>
<para>
Zu einem Eintrag im Navigationsbaum kann auch ein anderes Dokument
eingebettet angezeigt werden.
Der DocBook-Quelltext enthält für das einzubettende Dokument einen gewöhnlichen Abschnitt
(<tag class="element">section</tag>-Element).
Der Titel des Abschnitts erscheint im Navigationsbaum.
Der Abschnitt enthält als Kindelement ein <tag class="element">link</tag>-Element
mit dem Attribut <tag class="attribute">role</tag> = "<literal>embed</literal>".
Das Attribut <tag class="attribute">xl:href</tag> des
<tag class="element">link</tag>-Elements enthält die URL des einzubettenden Dokuments.
Unterabschnitte können unabhängig davon für andere einzubettende Dokumente stehen
oder nicht.
</para>
</d:section>

<d:para>Präfix des XSLT-Verweises im Ergebnis</d:para>
<xsl:param name="p_styleprefix" select="'style'"/>

<d:para>
Format des Datums (<d:code>phrase[@role='date']</d:code>) im Text
<d:simplelist>
<d:member>simple: 03.01.2012</d:member>
<d:member>montext: 03. Januar 2012</d:member>
</d:simplelist>
</d:para>
<xsl:param name="p_datefmt" select="'montext'"/>

<d:para>
Anpassung der Docbook-Stylesheets:
Verweisziele im neuen Fenster/Tab öffnen.
</d:para>
<xsl:param name="ulink.target">_blank</xsl:param>

<d:para>Die Monatsnamen</d:para>
<xsl:variable name="g_monate" select="document('')/xsl:stylesheet/hsh:hash"/>

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

<d:para>
Der HTML-Rahmen
</d:para>
<xsl:template match="/">
  <xsl:variable name="title" select="db:article/db:info/db:title"/>
  <xsl:processing-instruction name="xml-stylesheet">
    <xsl:text>href="</xsl:text>
    <xsl:value-of select="$p_styleprefix"/>
    <xsl:text>/index.xslt" type="application/xml"</xsl:text>
  </xsl:processing-instruction>
  <xsl:text>
</xsl:text>
  <html e:use="y">
    <xsl:attribute name="xml:lang">
      <xsl:choose>
        <xsl:when test="*/@xml:lang">
          <xsl:value-of select="*/@xml:lang"/>
        </xsl:when>
        <xsl:when test="*/@lang">
          <xsl:value-of select="*/@lang"/>
        </xsl:when>
        <xsl:otherwise>de</xsl:otherwise>
      </xsl:choose>
    </xsl:attribute>
    <head>
      <title><xsl:value-of select="$title"/></title>
      <xsl:apply-templates select="db:article/db:info//db:audiodata/@fileref"/>
      <xsl:apply-templates select="db:article/db:info/db:keywordset" mode="html.header"/>
    </head>
    <xsl:apply-templates/>
  </html>
</xsl:template>

<d:para>
Information über den Hintergrundklang als <d:tag class="element">meta</d:tag>-Element
</d:para>
<xsl:template match="db:audiodata/@fileref">
  <meta name="backgroundsound" content="{.}"/>
</xsl:template>

<d:para>Der Rumpf</d:para>
<xsl:template match="db:article">
  <body>
    <h1><xsl:value-of select="db:info/db:title"/></h1>
    <div class="hidden">
Anscheinend interpretiert Ihr Browser nicht die Stil-Vorlage.
Gibt es eine neuere Version Ihres Browsers?
    </div>
    <div id="div_links"/>
    <xsl:apply-templates select="db:section"/>
  </body>
</xsl:template>

<section xmlns="http://herbaer.de/xmlns/20051201/doc">
<para>Ein Abschnitt</para>
<para>
Dem erzeugten <tag class="element">div</tag>-Element werden zwei Attribute hinzugefügt:
<tag class="attribute">class</tag> und <tag class="attribute">id</tag>.
</para>
<para>
Wenn das <tag class="element">section</tag>-Element des Quelltextes ein
<tag class="attribute">xml:id</tag>-Attribut enthält,
wird der Wert dieses Attribut als Wert des <tag class="attribute">id</tag>-Attributs
übernommen.
Andernfalls ist der Wert des <tag class="attribute">id</tag>-Attributs von der Form
<literal>div_l<replaceable>LEVEL</replaceable>_p<replaceable>POS</replaceable></literal>.
<replaceable>LEVEL</replaceable> steht für die Anzahl der übergeordneten
<tag class="element">section</tag>-Elemente plus 1.
<replaceable>POS</replaceable> steht für die Anzahl der übergeordneten und vorhergehenden
<tag class="element">section</tag>-Elemente plus 1.
</para>
<para>
Wenn das Attribut <tag class="attribute">role</tag>
des <tag class="element">section</tag>-Elements des Quelldokuments das Wort
"<literal>hb_no_navig</literal>" enthält,
ist der Wert des <tag class="attribute">class</tag>-Attributs
"<literal>l<replaceable>LEVEL</replaceable></literal>".
Sonst ist der Attributwert "<literal>section l<replaceable>LEVEL</replaceable></literal>".
</para>
</section>
<xsl:template match="db:section">
  <xsl:variable name="level" select="count (ancestor::db:section) + 1"/>
  <xsl:variable name="num_prec" select="count (preceding::db:section) + $level"/>
  <xsl:variable name="navig">
    <xsl:if test="not (contains (@role, 'hb_no_navig'))">section </xsl:if>
  </xsl:variable>
  <div class="{$navig}l{$level}">
    <xsl:attribute name="id">
      <xsl:choose>
        <xsl:when test="@xml:id">
          <xsl:value-of select="@xml:id"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="concat ('div_l', $level, '_p', $num_prec)"/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:attribute>
    <xsl:apply-templates select="(db:link [@role = 'embed' and @xl:href])[1]" mode="embed"
    />
    <xsl:apply-templates/>
  </div>
</xsl:template>

<section xmlns="http://herbaer.de/xmlns/20051201/doc">
<para>
Eine Abschnitts-Überschrift wird im Ergebnis als
<tag class="element">h2</tag>, <tag class="element">h3</tag>,
<tag class="element">h4</tag>, <tag class="element">h5</tag> oder
<tag class="element">h6</tag> dargestellt.
</para>
<para>
Der Wert des Attributs <tag class="attribute">class</tag> hat die Form
"<literal>l<replaceable>LEVEL</replaceable></literal>".
"<replaceable>LEVEL</replaceable>" steht für die Anzahl der übergeordneten
<tag class="element">section</tag>-Elemente plus 1.
</para>
</section>
<xsl:template match="db:section/db:title">
  <xsl:param name="level" select="count (ancestor::db:section) + 1"/>
  <xsl:variable name="elname">
    <xsl:choose>
      <xsl:when test="$level &lt; 6">
        <xsl:value-of select="concat ('h', $level)"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:text>h6</xsl:text>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:variable>
  <xsl:element name="{$elname}">
    <xsl:attribute name="class">
      <xsl:value-of select="concat ('l', $level)"/>
    </xsl:attribute>
    <xsl:apply-templates/>
  </xsl:element>
</xsl:template>

<d:para>Verweis auf einzubettenden Inhalt</d:para>
<xsl:template match="db:link [@role = 'embed' and @xl:href]">
  <a href="{@xl:href}">
    <xsl:choose>
      <xsl:when test="text() | db:*">
        <xsl:apply-templates/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="@xl:href"/>
      </xsl:otherwise>
    </xsl:choose>
  </a>
</xsl:template>

<d:para>
Attribut des enthaltenden <d:tag clas="element">div</d:tag>-Elements
mit der URL des einzubettenden Inhalts als Wert
</d:para>
<xsl:template match="db:link [@role = 'embed' and @xl:href]" mode="embed">
  <xsl:attribute name="e:embed">
    <xsl:value-of select="@xl:href"/>
  </xsl:attribute>
</xsl:template>

<d:para>Allgemeine Verweise</d:para>
<xsl:template match="db:link [@xl:href and not (@role)]">
  <a href="{@xl:href}">
    <xsl:if test="string-length ($ulink.target) &gt; 0">
      <xsl:attribute name="target">
        <xsl:value-of select="$ulink.target"/>
      </xsl:attribute>
    </xsl:if>
    <xsl:apply-templates select="@xl:title"/>
    <xsl:apply-templates/>
  </a>
</xsl:template>

<d:para>Titel zu einem Verweis</d:para>
<xsl:template match="db:link/@xl:title">
  <xsl:attribute name="title">
    <xsl:value-of select="."/>
  </xsl:attribute>
</xsl:template>

<d:para>Inline-Elemente</d:para>
<xsl:template
  match = "
    db:personname | db:honorific | db:firstname | db:surname
    | db:street | db:postcode | db:city | db:phone
  "
>
  <xsl:apply-templates/>
</xsl:template>

<d:para>
Datum mit oder ohne Monatsnamen in Klammern
</d:para>
<xsl:template match="db:phrase[@role='date']">
  <xsl:choose>
    <xsl:when test="$p_datefmt = 'montext'">
      <xsl:variable name="mon" select="substring (., 6, 2)"/>
      <xsl:value-of
        select = "
          concat (
          substring (., 9, 2), '. ',
          $g_monate/hsh:value[@key = $mon], ' ',
          substring (., 1, 4)
          )
        "
      />
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of
        select = "
          concat (
          substring (., 9, 2), '.', substring (., 6, 2), '.', substring (., 1, 4) )
        "
      />
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<d:para>
Die Monatsnamen, s.
<d:filename>hash.rng</d:filename>
</d:para>
<hsh:hash xmlns="http://herbaer.de/xmlns/20121015/hash">
  <value key="01">Januar</value>
  <value key="02">Februar</value>
  <value key="03">März</value>
  <value key="04">April</value>
  <value key="05">Mai</value>
  <value key="06">Juni</value>
  <value key="07">Juli</value>
  <value key="08">August</value>
  <value key="09">September</value>
  <value key="10">Oktober</value>
  <value key="11">November</value>
  <value key="12">Dezember</value>
</hsh:hash>

</xsl:stylesheet>
