<?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:tr = "http://herbaer.de/xmlns/20151222/tree/"
  xmlns:ht = "http://www.w3.org/1999/xhtml"
  xmlns:xl = "http://www.w3.org/1999/xlink"
  xmlns = "http://www.w3.org/1999/xhtml"
  version = "1.0"
>
<d:info xmlns="http://herbaer.de/xmlns/20051201/doc">
  <title>tree_ht.xslt</title>
  <subtitle>HTML-Darstellung eines Teilbaums</subtitle>
  <date>2015-12-23</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 ein XHTML-Dokument.
Dessen <literal>xml-stylesheet</literal>-Verarbeitungsanweisung
verweist auf <filename>treelist.xslt</filename>.
</para>
<para>
Dem Teilbaum entspricht ein
<tag class="element">ul</tag>-Element mit dem Attribut
<code><tag class="attribute">class</tag> =
"<tag class="attvalue">tree</tag>"</code>.
Dieses Attribut zeigt an, dass das
<tag class="element">ul</tag>-Element als &#x201e;faltbarer&#x201d; Baum
anzuzeigen ist.
Das
<tag class="element">ul</tag>-Element enthält ein einziges
<tag class="element">li</tag>-Element, das dem Wurzelknoten entspricht.
Das Attribut
<code><tag class="attribute">class</tag> =
"<tag class="attvalue">x</tag>"</code>
zeigt an, dass der Knoten anfangs &#x201e;expandiert&#x201d; angezeigt wird.
</para>
<para>
Die
<tag class="element">li</tag>-Elemente zu einem Dateiknoten enthalten einen Verweis
(<tag class="element">a</tag>-Element).
</para>
<para>
Die
<tag class="element">li</tag>-Elemente zu einem Verzeichnisknoten enthalten ein
<tag class="element">span</tag>-Element mit einem Verweis auf die Index-Datei
sowie ein verschachteltes
<tag class="element">ul</tag>-Element, dessen
<tag class="element">li</tag>-Kindelemente den Kindknoten entsprechen.
</para>
</d:section>

<d:para>
ID des Teilbaums.
Sie ist die Verkettung der Namen der Knoten
(<d:tag class="element">tr:name</d:tag>)
vom Wurzelknoten bis zum Teilbaum-Knoten.
Die Knotennamen werden durch einen Punkt <d:literal>.</d:literal> getrennt.
</d:para>
<xsl:param name="p_id" select="''"/>

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

<d:para>
Die Suche nach dem Teilbaum beginnt.
</d:para>
<xsl:template match="/tr:tree">
  <xsl:apply-templates select="tr:node" mode="search">
    <xsl:with-param name="pid" select="''"/>
  </xsl:apply-templates>
</xsl:template>

<d:section xmlns="http://herbaer.de/xmlns/20051201/doc">
<para>
Der Teilbaum wird gesucht.
Die Verkettung der Namen der übergeordeten Knoten mit dem Punkt
als Trennzeichen wird als Parameter
<parameter>pid</parameter>
übergeben.
Ein Punkt und der Name des Knotens werden angehängt.
Falls die Zeichenkette mit dem globalen Parameter
<parameter>p_id</parameter> übereinstimmt,
wird ein XHMLT-Dokument erzeugt.
Andernfalls werden die untergeordneten Knoten durchsucht.
</para>
</d:section>
<xsl:template match="tr:node" mode="search">
  <!-- ID des Elternelements -->
  <xsl:param name="pid"/>
  <xsl:variable name="id">
    <xsl:if test="string-length ($pid)">
      <xsl:value-of select="concat ($pid, '.')"/>
    </xsl:if>
    <xsl:value-of select="tr:name"/>
  </xsl:variable>
  <xsl:choose>
    <xsl:when test="$id = $p_id">
      <xsl:processing-instruction name="xml-stylesheet">
        <xsl:text>href = "/kal/s/treelist.xslt" type="application/xml"</xsl:text>
      </xsl:processing-instruction>
      <html>
        <xsl:attribute name="xml:lang">
          <xsl:choose>
            <xsl:when test="/tr:tree/@xml:lang">
              <xsl:value-of select="/tr:tree/@xml:lang"/>
            </xsl:when>
            <xsl:otherwise>de</xsl:otherwise>
          </xsl:choose>
        </xsl:attribute>
        <head>
          <title>
            <xsl:value-of select="tr:title"/>
          </title>
        </head>
        <body>
          <ul class="tree">
            <xsl:apply-templates select="." mode="item">
              <xsl:with-param name="class" select="'x'"/>
              <xsl:with-param name="refbase" select="'[none]'"/>
            </xsl:apply-templates>
          </ul>
        </body>
      </html>
    </xsl:when>
    <xsl:otherwise>
      <xsl:apply-templates select="tr:node" mode="search">
        <xsl:with-param name="pid" select="$id"/>
      </xsl:apply-templates>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<d:para>
HTML-Listeneintrag zu einem Knoten
</d:para>
<xsl:template match="tr:node" mode="item">
  <!-- Wert des Attributs @class -->
  <xsl:param name="class"/>
  <!-- Basispfad für Verweise -->
  <xsl:param name="refbase"/>
  <xsl:variable name="rb">
    <xsl:choose>
      <xsl:when test="$refbase = '[none]'"/>
      <xsl:when test="starts-with (tr:refbase, '/')">
        <xsl:value-of select="tr:refbase"/>
      </xsl:when>
      <xsl:when
        test = "
          string-length ($refbase) &gt; 0
          and string-length (tr:refbase) &gt; 0
          and not ($refbase = '/')
        "
      >
        <xsl:value-of select="concat ($refbase, '/', tr:refbase)"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="concat ($refbase, tr:refbase)"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:variable>
  <li>
    <xsl:if test="string-length ($class) &gt; 0">
      <xsl:attribute name="class">
        <xsl:value-of select="$class"/>
      </xsl:attribute>
    </xsl:if>
    <xsl:variable name="href">
      <xsl:choose>
        <xsl:when test="starts-with (tr:ref, '/')">
          <xsl:value-of select="tr:ref"/>
        </xsl:when>
        <xsl:when
          test = "
            string-length ($rb) &gt; 0
            and string-length (tr:ref) &gt; 0
            and not ($rb = '/')
          "
        >
          <xsl:value-of select="concat ($rb, '/', tr:ref)"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="concat ($rb, tr:ref)"/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:variable>
    <xsl:choose>
      <xsl:when test="tr:node">
        <span>
          <xsl:choose>
            <xsl:when test="tr:ref">
              <a href="{$href}">
                <xsl:value-of select="tr:title"/>
              </a>
            </xsl:when>
            <xsl:otherwise>
              <xsl:value-of select="tr:title"/>
            </xsl:otherwise>
          </xsl:choose>
        </span>
        <ul>
          <xsl:apply-templates select="tr:node" mode="item">
            <xsl:with-param name="refbase" select="$rb"/>
          </xsl:apply-templates>
        </ul>
      </xsl:when>
      <xsl:otherwise>
        <a href="{$href}">
          <xsl:value-of select="tr:title"/>
        </a>
      </xsl:otherwise>
    </xsl:choose>
  </li>
</xsl:template>

</xsl:stylesheet>
