Wer Dokumente verarbeitet, vor allem solche, die nicht in einem proprietären Format (Word, Quark et cetera) vorliegen, kann dies mit selbst geschriebenen Programmen oder Werkzeugen wie sed, awk oder Perl tun. Dabei spielen Variable und Übergabeparameter oft eine wichtige Rolle. Ähnliches ist in XSLT möglich, denn mit xsl:variable und xsl:param sieht die Spezifikation der XSL-Transformationen Elemente vor, die die Konstruktion des Ergebnisbaums erleichtern.
<xsl:param name="year"> <xsl:variable name="dir">html</xsl:variable> <xsl:variable name="dir" select="html"/> <xsl:variable name="mynumber">2</xsl:variable> <xsl:variable name="mynumber" select="2"/>
Beide Elemente haben ein obligatorisches (name) und ein optionales Attribut (select); sie können sowohl als Top-Level-Element als auch innerhalb von Templates vorkommen. name benennt die Variable/den Parameter; das select bewirkt bei xsl:variable, dass das Element leer sein muss und beinhaltet die Auswertung eines Ausdrucks, etwa select="system-property('file.separator')", der bezeichnet, durch welches Zeichen das Betriebssystem Pfade zusammensetzt (Schrägstrich unter Unix oder Backslash unter MSDOS).
Die beiden letzten Beispiele sind der XSLT-Spezifikation entnommen und zeigen, wie unterschiedlich der Effekt ist. In der vierten Zeile ist die Variable mynumber an ein Bruchstück des Ergebnisbaums (result tree fragment) gebunden, nicht an die Zahl 2. Will man auf die Zahl zugreifen, kann man das auf beiden Wegen lösen, muss das allerdings auf unterschiedliche Weise tun. Dabei ist die erste etwas umständlicher:
<!-- Lösung 1 --> <xsl:variable name="mynumber">2</xsl:variable> <xsl:value-of select="wasauchimmer[position() = $mynumber]"/> <!-- Lösung 2 --> <xsl:variable name="mynumber" select="2"/> <xsl:value-of select="wasauchimmer[$mynumber]"/>
Obwohl in beiden Fällen die Ziffer 2
bearbeitet wird, handelt es sich um unterschiedliche
Herangehensweisen. In Lösung 1 ist 2
Inhalt eines
Elements (xsl:variable), im zweiten Bestandteil
eines Ausdrucks, der automatisch ausgewertet wird. Das führt dazu, dass
im ersten Fall durch [position() = $mynumber]
statt nur [$mynumber] erst der Ausdruck erzeugt
wird, der im zweiten Beispiel das
select-Statement ausmacht.
Parameter kann man auch über den Programmaufruf
setzen. Soll nicht, wie im Beispiel oben, html
der
Inhalt von dir sein, sondern der Wert von außen
gesetzt werden, muss man dir nur in einem leeren Element
deklarieren.
<xsl:param name="dir"/>
Der XSLT-Prozessor erhält den Parameter von der Kommandozeile oder über ein Programm. Bei einem Aufruf von Saxon sieht das aus wie das folgende Kurzlisting.
saxon xml-datei.xml stylesheet.xsl dir="my_dir"
Das erwähnte Bruchstück des Ergebnisbaums
ist
ein zu den aus XPath bekannten Datentypen
(string, number, boolean
und node-set, siehe Kapitel 7) hinzukommender Typ, der wie eine
Knotenmenge, die nur aus einem Knoten besteht, behandelt
wird. Eine Einschränkung: Anders als bei der Knotenmenge
sind nur die Operationen erlaubt, die auch bei Zeichenketten
erlaubt sind, also keine Operatoren wie /,
// oder [].
Mit xsl:copy-of kann man einen Teil des Ergebnisbaums in ihn selbst kopieren. Tut man das, wird der Inhalt des Bruchstücks nicht wie bei xsl:value-of zu einem String konvertiert, sondern er landet dort in seiner Gesamtheit: Die gesamte adressierte Knotenmenge (inklusive Kindelementen). Handelt es sich bei dem select-Ausdruck von xsl:copy-of weder um einen Teil des Ergebnisbaums noch um eine Knotenmenge, wird sein Ergebnis zu einer Zeichenkette konvertiert und in den Ergebnisbaum kopiert.
Zwischen einzelnen Templates kann man Parameter mit
dem Element xsl:with-param übergeben. Es muss
einen Namen haben, damit es ansprechbar
ist. Um bei
dem Verzeichnis-Beispiel zu bleiben: Wenn in einem Template
der Wert für das Verzeichnis auf Grund einer
xsl:when-Abfrage unterschiedlich sein soll, wird
das zutreffende Ergebnis übertragen und im zweiten Template
verwendet.
<!-- global --> <xsl:param name="dir"/> <!-- Templates --> <xsl:template name="mytemplate"> <xsl:choose> <xsl:when test="@format='html'"> <xsl:param name="dir">html</xsl:param> </xsl:when> <xsl:otherwise> <xsl:param name="dir">text</xsl:param> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template match="my-element"> <xsl:apply-templates> <xsl:with-param name="dir"/> </xsl:apply-templates> </xsl:template> <!-- Generieren einer Datei innerhalb eines Template --> <saxon:output file="{$dir}{$filesep}dies-element.html" ...>
Auf ähnliche Weise lassen sich Werte vorgeben, die überschreibbar sind. Das zweite Template würde dann nur den Namen des Parameters benutzen, ihm aber einen eigenen Wert geben.