<?xml version="1.0"?>
<?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:ii = "http://herbaer.de/xmlns/20110902/imgindex"
  xmlns:sm = "http://www.sitemaps.org/schemas/sitemap/0.9"
  xmlns:i = "http://www.google.com/schemas/sitemap-image/1.1"
  xmlns:c = "http://www.google.com/codesearch/schemas/sitemap/1.0"
  xmlns = "http://www.sitemaps.org/schemas/sitemap/0.9"
  exclude-result-prefixes = "xsl d ii sm"
  version = "1.0"
>

<d:info xmlns="http://herbaer.de/xmlns/20051201/doc">
  <title>sitemap_add_images.xslt</title>
  <subtitle>Bilder zur Sitemap hinzufügen</subtitle>
  <date>2020-04-08</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">
<d:para>
  Diese Transformation fügt die Bilder
  mit der besten Bewertung in die Sitemap-Datei ein.
</d:para>
</d:section>

<d:para>Verweisziel der XSLT-Anweisung</d:para>
<xsl:param name="p_xslt" select="'style/sitemap.xslt'"/>

<d:para>
Muster des Dateipfades einer Bild-Indexauswahl-Datei
mit dem Platzhalter '<d:literal>${storyid}</d:literal>'
</d:para>
<xsl:param name="p_ptn_imgix" select="'../../imgix/imgix_${storyid}.xml'"/>

<d:para>
Muster des relativen URL-Pfades einer Bildergeschichte
mit dem Platzhalter '<d:literal>${storyid}</d:literal>'
</d:para>
<xsl:param name="p_ptn_storyurl" select="'/s${storyid}/story.xml'"/>

<d:para>
Muster des relative URL-Pfades eines Bildes mit den Platzhaltern
'<d:literal>${storyid}</d:literal>' und '<d:literal>${imgid}</d:literal>'
</d:para>
<xsl:param name="p_ptn_imgurl" select="'/s${storyid}/smallimg/${imgid}.jpg'"/>

<d:para>URL des "WWW"-Webservers</d:para>
<xsl:param name="p_urlwww" select="'http://kleider.herbaer.de'"/>

<d:para>URL des lokalen Webservers</d:para>
<xsl:param name="p_urlloc" select="'http://kleider'"/>

<d:para>Vorlage <d:literal>txt.replacelist</d:literal></d:para>
<xsl:include href="/pool/txt.xslt"/>

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

<d:para>
Prüft, ob eine Zeichenkette einem Platzhaltermuster entspricht.
Das Ergebnis ist eine Liste der Form
<d:literal>[platzhaltername]=[Wert](,[platzhaltername]=[Wert])*</d:literal>
</d:para>
<xsl:template name="placeholdermatch">
  <!-- der zu prüfende Text -->
  <xsl:param name="txt"/>
  <!-- das Muster -->
  <xsl:param name="pattern"/>
  <!-- das bisherige Ergebnis -->
  <xsl:param name="result" select="''"/>
  <!-- Anfang eines Platzhalters -->
  <xsl:param name="phbegin" select="'${'"/>
  <!-- Ende eines Platzhalters -->
  <xsl:param name="phend" select="'}'"/>
  <!-- Eintrag im Ergebnis: Anfang eines Name/Wert-Paares -->
  <xsl:param name="pairbegin" select="'['"/>
  <!-- Eintrag im Ergebnis: Trenner in einem Paar -->
  <xsl:param name="pairsep" select="']=['"/>
  <!-- Eintrag im Ergebnis: Ende eines Paares -->
  <xsl:param name="pairend" select="']'"/>
  <!-- Ergebnis: Trenner zwischen den Paaren -->
  <xsl:param name="sep" select="','"/>
  <xsl:choose>
    <xsl:when test="starts-with ($pattern, $phbegin)">
      <xsl:variable name="t" select="substring-after ($pattern, $phbegin)"/>
      <xsl:call-template name="placeholdermatch">
        <xsl:with-param name="txt" select="$txt"/>
        <xsl:with-param name="pattern" select="substring-after ($t, $phend)"/>
        <xsl:with-param name="result">
          <xsl:if test="string-length ($result) &gt; 0">
            <xsl:value-of select="concat ($result, $sep)"/>
          </xsl:if>
          <xsl:value-of select="concat ($pairbegin, substring-before ($t, $phend), $pairsep)"
          />
        </xsl:with-param>
        <xsl:with-param name="phbegin" select="$phbegin"/>
        <xsl:with-param name="phend" select="$phend"/>
        <xsl:with-param name="pairbegin" select="$pairbegin"/>
        <xsl:with-param name="pairsep" select="$pairsep"/>
        <xsl:with-param name="pairend" select="$pairend"/>
        <xsl:with-param name="sep" select="$sep"/>
      </xsl:call-template>
    </xsl:when>
    <xsl:when test="contains ($pattern, $phbegin)">
      <xsl:variable name="t" select="substring-before ($pattern, $phbegin)"/>
      <xsl:if test="contains ($txt, $t)">
        <xsl:variable name="v" select="substring-before ($txt, $t)"/>
        <xsl:choose>
          <xsl:when test="string-length ($result) = 0 and string-length ($v) &gt; 0"/>
          <xsl:otherwise>
            <xsl:call-template name="placeholdermatch">
              <xsl:with-param name="txt" select="substring-after ($txt, $t)"/>
              <xsl:with-param name="pattern" select="substring ($pattern, string-length ($t) + 1)"
              />
              <xsl:with-param name="result">
                <xsl:if test="string-length ($result) &gt; 0">
                  <xsl:value-of select="concat ($result, $v, $pairend)"/>
                </xsl:if>
              </xsl:with-param>
              <xsl:with-param name="phbegin" select="$phbegin"/>
              <xsl:with-param name="phend" select="$phend"/>
              <xsl:with-param name="pairbegin" select="$pairbegin"/>
              <xsl:with-param name="pairsep" select="$pairsep"/>
              <xsl:with-param name="pairend" select="$pairend"/>
              <xsl:with-param name="sep" select="$sep"/>
            </xsl:call-template>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:if>
    </xsl:when>
    <xsl:when test="string-length ($pattern) = 0">
      <xsl:if test="string-length ($result) &gt; 0">
        <xsl:value-of select="concat ($result, $txt, $pairend)"/>
      </xsl:if>
    </xsl:when>
    <xsl:when test="not (contains ($txt, $pattern))"/>
    <xsl:when test="string-length (substring-after ($txt, $pattern)) &gt; 0"/>
    <xsl:when test="string-length ($result) &gt; 0">
      <xsl:value-of select="concat ($result, substring-before ($txt, $pattern), $pairend)"
      />
    </xsl:when>
    <xsl:when test="$txt = $pattern">
      <xsl:text>MATCH</xsl:text>
    </xsl:when>
    <xsl:otherwise/>
  </xsl:choose>
</xsl:template>

<d:para>Wurzel</d:para>
<xsl:template match="/">
  <xsl:if test="string-length ($p_xslt) &gt; 0 and $p_xslt != 'none'">
    <xsl:processing-instruction name="xml-stylesheet">
      <xsl:value-of select="concat ('href=&quot;', $p_xslt, '&quot; type=&quot;application/xml&quot;')"
      />
    </xsl:processing-instruction>
  </xsl:if>
  <xsl:apply-templates select="sm:urlset"/>
</xsl:template>

<d:para>
Das Wurzelelement
</d:para>
<xsl:template match="sm:urlset">
  <urlset>
    <xsl:copy-of select="@*"/>
    <xsl:if test="not (@xml:lang)">
      <xsl:attribute name="xml:lang">de-DE</xsl:attribute>
    </xsl:if>
    <xsl:apply-templates select="sm:url"/>
  </urlset>
</xsl:template>

<d:para>
Eintrag zu einer URL
</d:para>
<xsl:template match="sm:url">
  <xsl:copy>
    <xsl:apply-templates select="@* | sm:* | c:*"/>
    <xsl:choose>
      <xsl:when test="i:*">
        <xsl:apply-templates select="i:*"/>
      </xsl:when>
      <xsl:when test="starts-with (sm:loc, $p_urlloc)">
        <xsl:variable name="m">
          <xsl:call-template name="placeholdermatch">
            <xsl:with-param name="txt" select="substring-after (sm:loc, $p_urlloc)"/>
            <xsl:with-param name="pattern" select="$p_ptn_storyurl"/>
          </xsl:call-template>
        </xsl:variable>
        <xsl:if test="contains ($m, '[storyid]=[')">
          <xsl:call-template name="insert_images">
            <xsl:with-param name="sid" select="substring-before (substring-after ($m, '[storyid]=['), ']')"
            />
          </xsl:call-template>
        </xsl:if>
      </xsl:when>
      <xsl:otherwise/>
    </xsl:choose>
  </xsl:copy>
</xsl:template>

<d:para>
Aus dem Inhalt eines c:codesearch - Elements
werden nur die Kindeelemente übernommen
</d:para>
<xsl:template match="c:codesearch">
  <xsl:copy>
    <xsl:apply-templates select="*"/>
  </xsl:copy>
</xsl:template>

<d:para>
In sm:loc - Elementen wird die URL des Servers ersetzt.
</d:para>
<xsl:template match="sm:loc">
  <xsl:copy>
    <xsl:choose>
      <xsl:when test="starts-with (., $p_urlloc)">
        <xsl:value-of select="concat ($p_urlwww, substring-after (., $p_urlloc))"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="."/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:copy>
</xsl:template>

<d:para>
Andere sm:* - und c:* - Elemente werden komplett kopiert
</d:para>
<xsl:template match="sm:* | c:*">
  <xsl:copy-of select="."/>
</xsl:template>

<d:para>
Bilder werden in das <d:tag class="element">url</d:tag>-Element eingefügt.
</d:para>
<xsl:template name="insert_images">
  <!-- Kennung der Bildergeschichte -->
  <xsl:param name="sid"/>
  <xsl:variable name="rlist" select="concat ('${storyid},', $sid)"/>
  <xsl:variable name="path">
    <xsl:call-template name="txt.replacelist">
      <xsl:with-param name="txt" select="$p_ptn_imgix"/>
      <xsl:with-param name="list" select="$rlist"/>
    </xsl:call-template>
  </xsl:variable>
  <xsl:apply-templates select="document($path)//ii:image [ii:rank = 1]">
    <xsl:sort select="ii:sectno" data-type="number"/>
    <xsl:with-param name="rlist" select="$rlist"/>
  </xsl:apply-templates>
</xsl:template>

<d:para>
Ein ausgewähltes (Rang 1) Bild wird eingefügt.
</d:para>
<xsl:template match="ii:image">
<!-- xsl:template match = "ii:image [ii:rank = 1]" -->
  <!--
    Ersetzungsliste für die Platzhalter in $p_ptn_imgurl:
    Platzhalter der Form ${...} und die Werte
  -->
  <xsl:param name="rlist"/>
  <xsl:variable name="list" select="concat ($rlist, ',${imgid},', ii:key)"/>
  <i:image>
    <i:loc>
      <xsl:value-of select="$p_urlwww"/>
      <xsl:call-template name="txt.replacelist">
        <xsl:with-param name="txt" select="$p_ptn_imgurl"/>
        <xsl:with-param name="list" select="$list"/>
      </xsl:call-template>
    </i:loc>
    <xsl:apply-templates select="ii:alt"/>
  </i:image>
</xsl:template>

<d:para>Titel eines Bildes</d:para>
<xsl:template match="ii:alt">
  <i:title>
    <xsl:apply-templates/>
  </i:title>
</xsl:template>

</xsl:stylesheet>
