<?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:d = "http://herbaer.de/xmlns/20051201/doc"
  xmlns = "http://www.w3.org/1999/xhtml"
  xmlns:ht = "http://www.w3.org/1999/xhtml"
  xmlns:kb = "http://herbaer.de/xmlns/20151211/kalenderbilder/"
  xmlns:lt = "http://herbaer.de/xmlns/20151212/loctext/"
  xmlns:l = "http://herbaer.de/xmlns/20141210/localization"
  xmlns:xl = "http://www.w3.org/1999/xlink"
  version = "1.0"
  xml:lang = "de"
>
<d:info xmlns="http://herbaer.de/xmlns/20051201/doc">
  <title>kal.xslt</title>
  <subtitle>Bild-Kalender</subtitle>
  <date>2015-12-11</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>
Diese Transformation erzeugt das HTML-Gerüst für die Kalender sowohl in der Bildschirm-
Ansicht als auch in der Druckausgabe.
Bildschirmansicht und Druckausgabe nutzen unterschiedliche CSS-Regeln
Die Steuerung der Sichtbarkeit der &#x201e;Blätter&#x201d; und des Fensters
&#x201e;Einstellung&#x201d; durch Javascript in der Bildschirmansicht
darf die Druckausgabe nicht stören.
</para>
<para>
Es gibt die folgenden Wörter im Wert der Attribute
<tag class="attribute">class</tag>:
</para>
<variablelist>
  <varlistentry>
    <term><literal>tiles</literal></term>
    <listitem>
      <para>
Abschnitt mit den Vorschaubildern (&#x201e;Kacheln&#x201d;)
auf dem &#x201e;Deckblatt&#x201d;
      </para>
    </listitem>
  </varlistentry>
  <varlistentry>
    <term><literal>n</literal></term>
    <listitem>
      <para>
Seitenbereiche für die Bildschirmansicht mit Schaltflächen,
die normalerweise nicht sichtbar (transparent) sind.
      </para>
    </listitem>
  </varlistentry>
  <varlistentry>
    <term><literal>hide</literal></term>
    <listitem>
      <para>
Fenster &#x201e;Einstellung&#x201d;:
<tag class="element">div</tag>-Element mit der ID <literal>set</literal>
      </para>
    </listitem>
  </varlistentry>
  <varlistentry>
    <term><literal>lft</literal></term>
    <listitem>
      <para>
<tag class="element">p</tag>-Elemente,
deren Inhalt linksbündig statt zentriert ausgegeben werden soll
(im Fenster &#x201e;Einstellung&#x201d;)
      </para>
    </listitem>
  </varlistentry>
  <varlistentry>
    <term><literal>d</literal></term>
    <listitem>
      <para>
Bildchen auf dem Deckblatt zu einem Monat.
      </para>
    </listitem>
  </varlistentry>
  <varlistentry>
    <term><literal>img</literal></term>
    <listitem>
      <para>
Umhüllende
<tag class="element">div</tag>- und
<tag class="element">a</tag>-Elemente
um das Bild eines Monatsblatts
      </para>
    </listitem>
  </varlistentry>
  <varlistentry>
    <term><literal>m</literal></term>
    <listitem>
      <para>
Bild
(<tag class="element">img</tag>-Element)
auf einem Monatsblatt
      </para>
    </listitem>
  </varlistentry>
</variablelist>
<para>
Es gibt die folgenden ID-Werte:
</para>
<variablelist>
  <varlistentry>
    <term><literal>d00</literal></term>
    <listitem>
      <para>
Das &#x201e;Deckblatt&#x201d;
      </para>
    </listitem>
  </varlistentry>
  <varlistentry>
    <term><literal>bl</literal></term>
    <listitem>
      <para>
Linker Seitenrandbereich mit dem Dreieck mit der Spitze nach links
      </para>
    </listitem>
  </varlistentry>
  <varlistentry>
    <term><literal>br</literal></term>
    <listitem>
      <para>
Rechter Seitenrandbereich mit dem Dreieck mit der Spitze nach rechts
      </para>
    </listitem>
  </varlistentry>
  <varlistentry>
    <term><literal>bt</literal></term>
    <listitem>
      <para>
Oberer Seitenrandbereich mit einigen &#x201e;Schaltern&#x201d; und Verweisen.
      </para>
    </listitem>
  </varlistentry>
  <varlistentry>
    <term><literal>ah</literal></term>
    <listitem>
      <para>
<tag class="element">a</tag>-Element im oberen Seitenrandbereich
verweist auf den Anfang des Kalenders.
      </para>
    </listitem>
  </varlistentry>
  <varlistentry>
    <term><literal>aa</literal></term>
    <listitem>
      <para>
<tag class="element">a</tag>-Element im oberen Seitenrandbereich
verweist auf die Startseite der Website.
      </para>
    </listitem>
  </varlistentry>
  <varlistentry>
    <term><literal>as</literal></term>
    <listitem>
      <para>
<tag class="attribute">a</tag>-Element im oberen Seitenrandbereich
öffnet das Fenster &#x201e;Einstellung&#x201d;.
      </para>
    </listitem>
  </varlistentry>
  <varlistentry>
    <term><literal>set</literal></term>
    <listitem>
      <para>
<tag class="element">div</tag>-Element (Fenster) &#x201e;Einstellung&#x201d;
      </para>
    </listitem>
  </varlistentry>
  <varlistentry>
    <term><literal>chk_vm</literal></term>
    <listitem>
      <para>
Markierungsfeld &#x201e;Vormonat&#x201e;
      </para>
    </listitem>
  </varlistentry>
  <varlistentry>
    <term><literal>chk_fm</literal></term>
    <listitem>
      <para>
Markierungsfeld &#x201e;Folgemonat&#x201e;
      </para>
    </listitem>
  </varlistentry>
  <varlistentry>
    <term><literal>chk_kw</literal></term>
    <listitem>
      <para>
Markierungsfeld &#x201e;Kalenderwoche&#x201e;
      </para>
    </listitem>
  </varlistentry>
  <varlistentry>
    <term><literal>chk_mc</literal></term>
    <listitem>
      <para>
Markierungsfeld &#x201e;Monatsname in Tabelle&#x201e;
      </para>
    </listitem>
  </varlistentry>
  <varlistentry>
    <term><literal>b_cl</literal></term>
    <listitem>
      <para>
Schaltfläche &#x201e;Schließen&#x201e; im Fenster &#x201e;Einstellung".
      </para>
    </listitem>
  </varlistentry>
  <varlistentry>
    <term><literal>t<replaceable>99</replaceable></literal></term>
    <listitem>
      <para>
<tag class="element">img</tag>-Element
des Kalenderblatts für den Monat <replaceable>99</replaceable>:
<literal>01</literal> für Januar, <literal>12</literal> für Dezember.
      </para>
    </listitem>
  </varlistentry>
 </variablelist>
<para>
Weitere ID-Werte und Wörter im Attribut
<tag class="attribute">class</tag> werden aus den
<link xl:href="grunddaten.dbk">Grunddaten</link> übernommen.
</para>
</d:section>

<d:para>Wurzelelement der Kalenderbilder</d:para>
<xsl:variable name="g_rootelt" select="/kb:kalenderbilder"/>

<d:para>
Eintrag zu einem Monat
</d:para>
<xsl:template match="kb:m">
  <xsl:apply-templates select="kb:s"/>
  <xsl:value-of select="kb:i"/>
  <xsl:text>||</xsl:text>
</xsl:template>

<d:para>
Kennung der Bildergeschichte
</d:para>
<xsl:template match="kb:s">
  <xsl:value-of select="."/>
  <xsl:text>|</xsl:text>
</xsl:template>

<xsl:template match="/">
  <xsl:apply-templates select="*"/>
</xsl:template>

<xsl:template match="kb:kalenderbilder">
  <xsl:call-template name="kalender">
    <xsl:with-param name="data">
      <xsl:text>||</xsl:text>
      <xsl:apply-templates select="kb:m"/>
    </xsl:with-param>
  </xsl:call-template>
</xsl:template>

<d:section xmlns="http://herbaer.de/xmlns/20051201/doc">
<d:para>
Erzeugt das HTML-Dokument
</d:para>
<para>
Der Parameter
<varname>data</varname> ist eine Zeichenkette mit den Daten der Bilder
im Format
<literal><replaceable>TITEL</replaceable>?||((<replaceable
>LINK</replaceable>|)?|<replaceable
>IMGID</replaceable>||){12}</literal>
</para>
<para>
<replaceable>LINK</replaceable> steht für die Kennung der Bildergeschichte
ohne das Präfix "<literal>s</literal>", optional gefolgt von einem
Fragmentbezeichner.
</para>
<para>
Der Kopf enthält Verweise auf die Dateien
<filename>kal.js</filename>,
<filename>kal.css</filename>
und <filename>kal.prt</filename>.
</para>
</d:section>
<xsl:template name="kalender">
  <!-- Zeichenkette: Titel und Bildauswahl, s. Beschreibung -->
  <xsl:param name="data"/>
  <!-- Vorläufige Kennung der Sprache aus dem Quelldokument -->
  <xsl:variable name="pl">
    <xsl:choose>
      <xsl:when test="string-length(@xml:lang) = 0"/>
      <xsl:when test="contains (@xml:lang, '-')">
        <xsl:value-of select="substring-before(@xml:lang, '-')"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="@xml:lang"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:variable>
  <xsl:variable name="lp">
    <xsl:choose>
      <xsl:when test="string-length($pl) = 0">
        <!--
Im Falle der Bildergeschichten ist @xml:lang immer definiert.
Hier liegt ein Kalender mit ausgewählten Bilder unter /kal/YYYY/BILDERAUSWAHL.xml vor.
Hier setze ich einen festen relativen Pfad zur Lokalisierungsdatei voraus.
        -->
        <xsl:value-of select="'../../local/local.xml'"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="concat ('/local/local.xml.', $pl)"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:variable>
  <!--
Der relative Pfad zurück zur Wurzel.
Kalenderbilddatei oder Bildergeschichte?
S. auch Fallunterscheidung in der Vorlage für ht:body/ht:div
  -->
  <xsl:variable name="home">
    <xsl:choose>
      <xsl:when test="string-length($pl) &gt; 0">
      <!--
$pl ist zu Bildergeschichten definiert.
Der Pfad einer Bildergeschichte ist /sID/story.xml
      -->
        <xsl:value-of select="'..'"/>
      </xsl:when>
      <xsl:otherwise>
      <!--
Zu einer Kalenderbilddatei ist keine Sprache definiert.
Der Pfad ist /kal/YYYY/BILDAUSWAHL.xml
      -->
        <xsl:value-of select="'../..'"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:variable>

  <xsl:variable name="g_l" select="document($lp)/l:localization"/>

  <xsl:variable name="y">
    <xsl:choose>
      <xsl:when test="$g_rootelt/kb:y">
        <xsl:value-of select="$g_rootelt/kb:y"/>
        <xsl:text>/a</xsl:text>
      </xsl:when>
      <xsl:otherwise>a</xsl:otherwise>
    </xsl:choose>
  </xsl:variable>
  <xsl:variable name="body" select="document(concat ('/kal/b/', $y, '.xml'))/ht:body"/>
  <xsl:variable name="lang">
    <xsl:variable name="a" select="$g_l/@xml:lang"/>
    <xsl:choose>
      <xsl:when test="string-length ($a) = 0">
        <xsl:text>de</xsl:text>
      </xsl:when>
      <xsl:when test="contains ($a, '-')">
        <xsl:value-of select="substring-before ($a, '-')"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$a"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:variable>
  <xsl:variable name="title">
    <xsl:choose>
      <xsl:when test="string-length (substring-before ($data, '||')) &gt; 0">
        <xsl:value-of select="substring-before ($data, '||')"/>
      </xsl:when>
      <xsl:when test="not ($g_rootelt/kb:t/lt:v)">
        <xsl:value-of select="$g_rootelt/kb:t"/>
      </xsl:when>
      <xsl:when test="$g_rootelt/kb:t/lt:v/lt:t [@l = $lang]">
        <xsl:value-of select="$g_rootelt/kb:t/lt:v/lt:t [@l = $lang]"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$g_rootelt/kb:t/lt:v/lt:t [@l = 'de']"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:variable>
  <xsl:variable name="a" select="substring-after ($data, '||')"/>
  <html>
    <xsl:copy-of select="$body/@xml:lang"/>
    <head>
      <meta name="viewport" content="width=device-width, initial-scale=1"/>
      <xsl:element name="link">
        <xsl:attribute name="rel">stylesheet</xsl:attribute>
        <xsl:attribute name="media">screen</xsl:attribute>
        <xsl:attribute name="href">/kal/s/kal.css</xsl:attribute>
      </xsl:element>
      <xsl:element name="link">
        <xsl:attribute name="rel">stylesheet</xsl:attribute>
        <xsl:attribute name="media">print</xsl:attribute>
        <xsl:attribute name="href">/kal/s/prt.css</xsl:attribute>
      </xsl:element>
      <link rel="icon" href="/style/shortcut_icon.png"/>
      <title>
        <xsl:value-of select="$title"/>
        <xsl:if test="$g_rootelt/kb:y">
          <xsl:value-of select="concat (' ', $g_rootelt/kb:y)"/>
        </xsl:if>
      </title>
      <xsl:element name="script">
        <xsl:attribute name="src">/kal/s/kal.js</xsl:attribute>
      </xsl:element>
    </head>
    <body>
      <div id="d00">
        <h1><xsl:value-of select="$title"/></h1>
        <xsl:apply-templates select="$body/@kb:y"/>
        <div class="tiles">
          <xsl:call-template name="tiles">
            <xsl:with-param name="l" select="$a"/>
          </xsl:call-template>
        </div>
      </div>
      <xsl:apply-templates select="$body/ht:div[2]">
        <xsl:with-param name="l" select="$a"/>
        <xsl:with-param name="g_l" select="$g_l"/>
      </xsl:apply-templates>
      <div id="bl" class="n">&#x25c0;</div>
      <div id="br" class="n">&#x25b6;</div>
      <div id="bt" class="n">
        <a id="ah">&#x25c9;</a>
        <a id="aa" href="{$home}/index.xhtml" target="_top">&#x2302;</a>
        <a id="as">&#x22ee;</a>
        <a href="{$home}/kal/s/kal_help.xhtml">?</a>
      </div>
      <div id="set" class="hide">
        <h3><l:ph id="einstell"/></h3>
        <p class="lft">
          <label>
            <input type="checkbox" id="chk_vm"/>
            <l:ph id="vormonat"/>
          </label>
        </p>
        <p class="lft">
          <label>
            <input type="checkbox" id="chk_fm"/>
            <l:ph id="folgemonat"/>
          </label>
        </p>
        <p class="lft">
          <label>
            <input type="checkbox" id="chk_kw" checked="checked"/>
            <l:ph id="kalenderwoche"/>
          </label>
        </p>
        <p class="lft">
          <label>
            <input type="checkbox" id="chk_mc"/>
            <l:ph id="monatsname_in_tabelle"/>
          </label>
        </p>
        <p>
          <button id="b_cl"><l:ph id="schliessen"/></button>
        </p>
      </div>
    </body>
  </html>
</xsl:template>

<d:para>
Ein Monatsbild auf der Titelseite
</d:para>
<xsl:template name="tiles">
  <xsl:param name="l"/>
  <xsl:param name="m" select="1"/>
  <xsl:variable name="mm" select="substring (100 + $m, 2)"/>
  <xsl:variable name="i" select="substring-before ($l, '||')"/>
  <xsl:variable name="a" select="substring-after ($l, '||')"/>
  <xsl:variable name="s">
    <xsl:choose>
      <xsl:when test="contains ($i, '#')">
        <xsl:value-of select="substring-before ($i, '#')"/>
      </xsl:when>
      <xsl:when test="contains ($i, '|')">
        <xsl:value-of select="substring-before ($i, '|')"/>
      </xsl:when>
      <xsl:otherwise/>
    </xsl:choose>
  </xsl:variable>
  <xsl:variable name="d">
    <xsl:if test="string-length ($s) &gt; 0">
      <xsl:value-of select="concat ('/s', $s, '/')"/>
    </xsl:if>
  </xsl:variable>
  <xsl:variable name="b">
    <xsl:choose>
      <xsl:when test="contains ($i, '|')">
        <xsl:value-of select="substring-after ($i, '|')"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$i"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:variable>
  <img src="{$d}smallimg/{$b}.jpg" class="d" id="t{$mm}"/>
  <xsl:if test="string-length ($a) &gt; 0">
    <xsl:call-template name="tiles">
      <xsl:with-param name="l" select="$a"/>
      <xsl:with-param name="m" select="$m + 1"/>
    </xsl:call-template>
  </xsl:if>
</xsl:template>

<d:para>
In die Abschnitte der Monate werden die Bilder eingefügt
</d:para>
<xsl:template match="ht:body/ht:div">
  <xsl:param name="l"/>
  <xsl:param name="g_l"/>
  <xsl:variable name="i" select="substring-before ($l, '||')"/>
  <xsl:variable name="a" select="substring-after ($l, '||')"/>
  <xsl:variable name="s">
    <xsl:choose>
      <xsl:when test="contains ($i, '#')">
        <xsl:value-of select="substring-before ($i, '#')"/>
      </xsl:when>
      <xsl:when test="contains ($i, '|')">
        <xsl:value-of select="substring-before ($i, '|')"/>
      </xsl:when>
      <xsl:otherwise/>
    </xsl:choose>
  </xsl:variable>
  <!-- Präfix für Verweise auf Bilder -->
  <xsl:variable name="d">
    <xsl:if test="string-length ($s) &gt; 0">
      <xsl:value-of select="concat ('/s', $s, '/')"/>
    </xsl:if>
  </xsl:variable>
  <!-- Präfix für Verweise zur Bildergeschichte -->
  <xsl:variable name="h">
    <xsl:if test="string-length ($s) &gt; 0">
      <xsl:value-of select="concat ('../../s', $s, '/')"/>
    </xsl:if>
  </xsl:variable>
  <xsl:variable name="b">
    <xsl:choose>
      <xsl:when test="contains ($i, '|')">
        <xsl:value-of select="substring-after ($i, '|')"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$i"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:variable>
  <xsl:variable name="f">
    <xsl:if test="contains ($i, '#')">
      <xsl:value-of select="concat ('#', substring-after (substring-before ($i, '|'), '#'))"
      />
    </xsl:if>
  </xsl:variable>
  <xsl:copy>
    <xsl:copy-of select="@*"/>
    <xsl:apply-templates select="ht:h1">
      <xsl:with-param name="g_l" select="$g_l"/>
    </xsl:apply-templates>
    <div class="img">
      <a href="{$h}story.xml{$f}" target="_top" class="img">
      <img src="{$d}images/{$b}.jpg" class="m"/>
      </a>
    </div>
    <xsl:apply-templates select="preceding-sibling::*[1]/ht:table">
      <xsl:with-param name="cls" select="'v'"/>
      <xsl:with-param name="g_l" select="$g_l"/>
    </xsl:apply-templates>
    <xsl:apply-templates select="ht:* [local-name(.) != 'h1']">
      <xsl:with-param name="g_l" select="$g_l"/>
    </xsl:apply-templates>
    <xsl:apply-templates select="following-sibling::*[1]/ht:table">
      <xsl:with-param name="cls" select="'n'"/>
      <xsl:with-param name="g_l" select="$g_l"/>
    </xsl:apply-templates>
  </xsl:copy>
  <xsl:if test="string-length ($a) &gt; 0">
    <xsl:apply-templates select="following-sibling::ht:div[1]">
      <xsl:with-param name="l" select="$a"/>
      <xsl:with-param name="g_l" select="$g_l"/>
    </xsl:apply-templates>
  </xsl:if>
</xsl:template>

<d:para>
Das Jahr erscheint unter der Überschrift des ersten Abschnitts
</d:para>
<xsl:template match="ht:body/@kb:y">
  <h1><xsl:value-of select="."/></h1>
</xsl:template>

<d:para>
HTML-Elemente werden kopiert
</d:para>
<xsl:template match="ht:*">
  <xsl:param name="cls"/>
  <xsl:param name="g_l"/>
  <xsl:copy>
    <xsl:choose>
      <xsl:when test="string-length ($cls) &gt; 0">
        <xsl:copy-of select="@*[local-name() != 'class']"/>
        <xsl:attribute name="class">
          <xsl:if test="@class">
            <xsl:value-of select="concat (@class, ' ')"/>
          </xsl:if>
          <xsl:value-of select="$cls"/>
        </xsl:attribute>
      </xsl:when>
      <xsl:otherwise>
        <xsl:copy-of select="@*"/>
      </xsl:otherwise>
    </xsl:choose>
    <xsl:apply-templates select="* | text()">
      <xsl:with-param name="g_l" select="$g_l"/>
    </xsl:apply-templates>
  </xsl:copy>
</xsl:template>

<d:para>
Platzhalter werden eingesetzt
</d:para>
<xsl:template match="l:ph">
  <xsl:param name="g_l"/>
  <xsl:variable name="id" select="@id"/>
  <xsl:value-of select="$g_l/l:t[@id=$id]"/>
</xsl:template>

</xsl:stylesheet>
