Variablenwerte sind temporäre Bäume

(Auszug aus "XSLT 2.0 & XPath 2.0" von Frank Bongers, Kapitel 3.)

In XSLT 1.0 existiert das Konzept des temporären Ergebnisbaumfragments, bes­ser bekannt als Result Tree Fragment(RTF). Ein RTF entsteht dann, wenn ein temporärer Baum erzeugt und in einer XSLT-Variable xsl:variable abgespei­chert wird.

Die Struktur im Inneren eines RTF ist allerdings nach seiner Erzeugung nicht durch XPath 1.0-Ausdrücke adressierbar. Ein RTF ist also kein eigentlicher Nodeset. Die Umwandlung eines RTF in einen »echten« Nodeset ist in XSLT 1.0 auch nicht vorgesehen und wurde daher in Erweiterungsfunktionen wie saxon:node-set(), exsl:node-set oder anderen nachgerüstet.

Anstatt eine derartige Funktion in XSLT 2.0 von vornherein zu implementieren, wurde das Konzept des RTF hier vollständig abgeschafft. Jeder in Zusammen­hang mit einer Variablen erzeugte temporäre Baum stellt nun eine echte Node-Sequenz dar. Als vollwertiger Baum besitzt er einen eigenen Wurzelkno­ten und es kann, vergleichbar mit einem eigenständigen Dokument, in ihm mit­tels XPath navigiert werden.

Eine Variable bzw. ein Parameter kann auf zwei unterschiedliche Arten zu einem Wert gelangen.

Über das select-Attribut

Besitzt die Variablen- oder Parameterdeklaration ein select-Attribut, dann muss der Wert dieses Attributs ein XPath-Ausdruck sein. Das Ergebnis der Aus­wertung dieses Ausdrucks wird zum Wert der Variablen. Es kann sich um einen String, eine Zahl, einen booleschen Wert oder eine Sequenz handeln. Ist ein select-Attribut vorhanden, muss das Element leer sein.

Diese Variable enthält z. B. die Zahl 2:

<xsl:variable name="n" select="2"/>

Über den Inhalt des Elements

Besitzt die Variablen- oder Parameterdeklaration kein select-Attribut, so wird der Inhalt der Deklaration zur Definition des Werts verwendet. Der so erzeugte Wert wird stets eine Sequenz sein, die sich aus dem Sequenz­konstruktor im Inneren des Elements ergibt.

Die Variable bzw. der Parameter enthält in diesem Fall nie einen einfachen ato­maren Wert wie eine Zahl oder einen String (obwohl der Unterschied oft nicht problematisch in Erscheinung tritt), sondern einen Dokumentknoten (der unter dem Variablennamen ansprechbar ist), dessen Kindknoten sich aus den Ergebnissen des Sequenzkonstruktors in der Deklaration ergeben. Der Wert stellt quasi eine Art von unabhängigem Dokumentbaum dar, der mittels XPath-Audrücken durchsucht und ausgewertet werden kann.

Diese Variable enthält z. B. eine Sequenz mit einem Textknoten mit dem String­wert »2« (dies kann ein Unterschied zu oben sein):

<xsl:variable name="n">2</xsl:variable>

Alternative Wertzuweisungen

Das Problem des fehlenden Zuweisungsoperators wurde bereits bei der Behandlung von xsl:variable angesprochen. Wollen Sie beispielsweise in JavaScript einer deklarierten Variable anhand einer Bedingung einen Wert zuweisen, so schreiben Sie einfach:

var die_variable;
if(bedingung)
   die_variable = der_wert;
else
   die_variable = anderer_wert;

Hier wird zuerst die Bedingung ausgewertet und dann entsprechend zugewie­sen, in XSLT geht es nur andersherum: Es muss erst deklariert und anschließend mit der Bedin­gung über den Wert entschieden werden:

<xsl:variable name="die_variable">
  <xsl:choose>
    <xsl:when test="$bedingung">der_wert</xsl:when>
    <xsl:otherwise>anderer_wert</xsl:otherwise>
  </xsl:choose>
</xsl:variable>

Dies geht auch einfacher, wenn Sie XPath 2.0 zu Hilfe nehmen:

<!-- Lösung mit XPath 2.0 -->
<xsl:variable name="die_variable" select="if($bedingung) then 'der_wert' else 'anderer_wert'"/>

Anmerkung:
Eine Einführung in die Formulierung von Bedingungen in XPath finden Sie unter Alternative in XPath: if - then - else.

   

<< zurück vor >>
Tipp der data2type-Redaktion:
Zum Thema XSLT bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

Copyright © Galileo Press, Bonn 2008
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "XSLT 2.0 & XPath 2.0 ― Das umfassende Handbuch" denselben Bestimmungen wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Galileo Press, Rheinwerkallee 4, 53227 Bonn