<?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:lt = "http://herbaer.de/xmlns/20151212/loctext/"
  version = "1.0"
>
<d:info xmlns="http://herbaer.de/xmlns/20051201/doc">
  <title>lt_chktrname.xslt</title>
  <subtitle>Attribut lt:t/@tr entfernen / ersetzen</subtitle>
  <date>2017-04-17</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 ersetzt, entfernt oder ergänzt
<tag class="element">lt:t</tag>/@<tag class="attribute">tr</tag>-Attribute.
</para>
</d:section>

<d:para>
Die Liste der Ersetzungen im Format
<d:literal><d:replaceable>ENTHALTEN</d:replaceable>:<d:replaceable
>NEUER_ATTWERT</d:replaceable>(#<d:replaceable>ENTHALTEN</d:replaceable>:<d:replaceable
>NEUER_ATTWERT</d:replaceable>)*</d:literal>.
Wenn der Wert des Attributs
<tag class="element">lt:t</tag>/@<tag class="attribute">tr</tag>
in der Eingabe die Zeichenfolge <d:replaceable>ENTHALTEN</d:replaceable> enthält, wird
<d:replaceable>NEUER_ATTWERT</d:replaceable> der neue Wert des Attributs in der Ausgabe.
Wenn keine der Zeichenfolgen <d:replaceable>ENTHALTEN</d:replaceable>
im Attributwert in der Eingabe enthalten ist
oder die Zeichenfolge <d:replaceable>NEUER_ATTWERT</d:replaceable> leer ist,
wird das Attribut entfernt.
Auch die Zeichenfolge <d:replaceable>ENTHALTEN</d:replaceable> kann leer sein.
</d:para>
<xsl:param name="p_replace" select="'google:Google Translate#:Google Translate'"/>

<d:para>
Der Default-Wert des Attributs
<tag class="element">lt:t</tag>/@<tag class="attribute">tr</tag>.
Wenn das Attribut in der Eingabe fehlt und dieser Wert nicht die leere Zeichenkette ist,
wird ein Attribut mit diesem Wert eingefügt.
</d:para>
<xsl:param name="p_default" select="''"/>

<d:para>
Listenverarbeitung: $list.map
</d:para>
<xsl:include href="/pool/list.xslt"/>
<xsl:include href="/pool/txt.xslt"/>

<d:para>
Vorlage zur Auswahl des passenden Ersetzungswertes
</d:para>
<xsl:variable
  name = "g_map_trvalue"
  select = "document('')/xsl:stylesheet/xsl:template[@name = 'list.map.trvalue']"
/>

<d:para>Die Wurzel</d:para>
<xsl:template match="/">
  <xsl:apply-templates select="comment() | processing-instruction() | *"/>
</xsl:template>

<d:para>Elemente werden kopiert</d:para>
<xsl:template match="*">
  <xsl:copy>
    <xsl:copy-of select="@*"/>
    <xsl:apply-templates select="comment() | processing-instruction() | text() | *"/>
  </xsl:copy>
</xsl:template>

<d:para>Kommentare, Verarbeitungsanweisungen und Text werden kopiert</d:para>
<xsl:template match="comment() | processing-instruction() | text()">
  <xsl:copy-of select="."/>
</xsl:template>

<d:para>Attribute werden kopiert</d:para>
<xsl:template match="@*">
  <xsl:copy-of select="."/>
</xsl:template>

<d:para>
Eine Sprachvariante
</d:para>
<xsl:template match="lt:t">
  <xsl:copy>
    <xsl:apply-templates select="@*"/>
    <xsl:if test="not (@tr) and string-length ($p_default) &gt; 0">
      <xsl:attribute name="tr">
        <xsl:value-of select="$p_default"/>
      </xsl:attribute>
    </xsl:if>
    <xsl:apply-templates select="text()"/>
  </xsl:copy>
</xsl:template>

<d:para>
Kennung des Übersetzers
</d:para>
<xsl:template match="lt:t/@tr">
  <!-- Liste der passenden neuen Attributwerte -->
  <xsl:variable name="list">
    <xsl:call-template name="list.map">
      <xsl:with-param name="list" select="$p_replace"/>
      <xsl:with-param name="mapper" select="$g_map_trvalue"/>
      <xsl:with-param name="param" select="."/>
      <xsl:with-param name="sep" select="'#'"/>
    </xsl:call-template>
  </xsl:variable>
  <xsl:choose>
    <!-- passender Ersetzungswert gefunden -->
    <xsl:when test="string-length ($list) &gt; 0">
      <xsl:variable name="nv" select="substring-before ($list, '#')"/>
      <xsl:if test="string-length ($nv) &gt; 0">
        <xsl:attribute name="tr">
          <xsl:value-of select="$nv"/>
        </xsl:attribute>
      </xsl:if>
    </xsl:when>
    <!-- kein passender Ersetzungswert gefunden -->
    <xsl:otherwise>
      <xsl:copy-of select="."/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<d:para>
Passende neue Attributwerte herausfiltern
</d:para>
<xsl:template
  name = "list.map.trvalue"
  mode = "list.apply"
  match = "xsl:template [@name = 'list.map.trvalue' and @mode = 'list.apply' and @match]"
>
  <!-- ein Ersetzungs-Paar ENTHALTEN:NEUER_ATTWERT -->
  <xsl:param name="item"/>
  <!-- das Attribut @tr -->
  <xsl:param name="param"/>
  <xsl:variable name="ent" select="substring-before ($item, ':')"/>
  <xsl:variable name="nv" select="substring-after ($item, ':')"/>
  <xsl:if test="contains ($param, $ent)">
    <xsl:value-of select="concat ($nv, '#')"/>
  </xsl:if>
</xsl:template>

</xsl:stylesheet>
