Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]1075[/thread]

XSLT: Variablen belegen

Leser: 10


<< >> 4 Einträge, 1 Seite
pktm
 2007-05-18 16:47
#9995 #9995
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hallo!

Ich komme gerade irgendwie nicht weiter.
Ich weis jetzt, wie man in XSLT eine Variable definiert und wie man sie ausliest.
Aber wie kann ich eine Variable nachträglich verändern?

Folgender Fall:
Ich habe eine riesige <choose> - Struktur. An jeder Stelle kommt natürlich etwas heraus und ich hätte das ergebnis gerne in einer Variable, weil ich das hinterher besser verarbeiten kann. Das fängt schon dabei an, dass ich das Ergebnis zweimal verwenden kann, ohne zweimal diese riesige <choose>-Struktur aufrufen zu müssen.

Also dachte ich mir, definiere ich mir eine Variable und belege die in der <choose>-Struktur.

Beispiel wie ich mir das vorgestellt habe:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
<xsl:variable name="trans">undef</xsl:variable>
<xsl:choose>
<xsl:when test="@lemma='ein'"><xsl:variable name="trans">a</xsl:variable></xsl:when>
<xsl:when test="@lemma='--'"><xsl:variable name="trans">--</xsl:variable></xsl:when>
<xsl:otherwise><xsl:variable name="trans" select="k. Ü." /></xsl:otherwise>
</xsl:choose>

<!-- jetzt die Variable verwenden -->
<tag>
<xsl:value-of select="$trans" />
</tag>


Das klappt nicht, weil ich zum einen die Variable schon außerhalb des choose-Tags deklariert habe und so wie es jetzt da steht die Variable zweimal deklarieren würde.
Ich will aber nur den Wert ändern.

Die Deklaration außerhalb der Choose-Struktur kann ich aber nicht weglassen, weil sonst der Skopus der Variable nicht ausreichend ist, da ich die ja später, nach dem <choose> verwenden möchte.

Kann mir jemand sagen, wie ich die Variable verändern kann?

Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
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.
pktm
 2007-05-27 01:44
#9997 #9997
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hallo!

Danke für die umfangreiche Antwort!
Ich habe Möglichkeit 1 im Einsatz, zur Zeit erstreckt sich der <choose>-Teile auf runde 5 Seiten. :-)

Danke & viele Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
Gast data2type
 2015-12-21 14:38
#183262 #183262
Hier noch ein Link mit weiteren Infos zu dem Thema: http://www.data2type.de/xml-xslt-xslfo/xslt/java-u...
Last edited: 2015-12-21 15:14:22 +0100 (CET)
<< >> 4 Einträge, 1 Seite



View all threads created 2007-05-18 16:47.