Thread XSLT: Variablen belegen (3 answers)
Opened by pktm at 2007-05-18 16:47

pKai
 2007-05-26 21:18
#9996 #9996
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
Hallo,

der Topic ist ja schon ein bißchen älter, aber vielleicht hast du dein Problem bisher nicht gelöst.

Die Frage "wie ändere ich eine Variable in XSLT" muss man mit "garnicht" beantworten, denn XSLT ist eine sogenannte funktionale Programmiersprache, das heißt man muss sich von dem Gedanken frei machen, dass "Variable" Speicherstellen sind, die beliebig manipuliert werden können. Vielmehr kann man sie als Aliasses für die Ergebnisse von Berechnungen sehen (siehe auch gleich die einleitenden Passagen im oben genannten Wikipedia-Link).

In XSLT 1.0 (zu 2.0 habe ich keine Erfahrung), gibt es (mindestens) 2 Möglichkeiten dein Problem zu lösen.

1) Die Berechnung in den Inhalt des xsl:variable Elements schreiben:
Code: (dl )
1
2
3
4
5
6
7
<xsl:variable name="trans">
<xsl:choose>
<xsl:when test="@lemma='ein'"><xsl:text>a</xsl:text></xsl:when>
<xsl:when test="@lemma='--'"><xsl:text>--</xsl:text></xsl:when>
<xsl:otherwise><xsl:text>k. Ü.</xsl:text></xsl:otherwise>
</xsl:choose>
</xsl:variable>


Technische Anmerkung: Der Datentyp von $trans ist dann ein sognenanntes "Result Tree Fragment" (RTF). Dies ist hier unproblematisch, da dies hier als String interpretiert werden kann.


2) Im select-Attribut
Diese Methode wird soweit ich weiss als Oliver-Becker-Methode bezeichnet. (Siehe seine Anmerkung zur substring-Funktion seiner Übersetzung der XPath-1.0-Spezifikation)
Quote
<xsl:variablename="trans"select="concat(substring('a',1div@lemma='ein'),substring('--',1div@lemma='--'),substring('k.Ü.',1divnot(@lemma='ein'or@lemma='--')))"/>


Wenn du sehr viele Alternativen hast, ist Methode 1 sicher vorzuziehen.

HTH

Update 19:25
Als 3. Methode könnte man auch eine (rekursive) Funktion (="Template" in XSLT-speak) schreiben die den gefundenen String ausgibt. Die würde man dann mit call-template an der gleichen Stelle rufen wo bei Methode 1 jetzt das choose steht.\n\n

<!--EDIT|pKai|1180200463-->
I sense a soul in search of answers.

View full thread XSLT: Variablen belegen