xsl:with-param
(Auszug aus "XSLT 2.0 & XPath 2.0" von Frank Bongers, Kapitel 3.)
Die Instruktion xsl:with-param erzeugt einen Parameterwert und übergibt diesen im Rahmen eines Aufrufs untergeordneter Templates oder Template-Regeln entweder direkt an dort vorhandene Parameter oder (mit tunnel="yes") an den Tunnelstrom, der von den aufgerufenen und diesen wiederum untergeordneten Templates genutzt werden kann.
<xsl:with-param name="qname" select="XPath-Ausdruck">
<!-- hier kann ein Template-Block stehen -->
</xsl:with-param>
Die Instruktion xsl:with-param wird hauptsächlich beim Aufruf benannter Templates im Inneren von xsl:call-template verwendet. Die Instruktion legt dann den Wert eines gleichnamigen Parameters xsl:param fest, der sich im aufgerufenen Template befindet. Dieser muss dort stets als erstes Child-Element stehen, also immer vor eventuellen Literal-Result-Elementen oder anderen XSLT-Instruktionen.
Ebenfalls auftreten darf die Instruktion im Inneren von xsl:apply-templates sowie im Inneren von xsl:apply-imports. Hierbei können mehrere xsl:with-param hintereinander stehen, ihre Reihenfolge untereinander spielt keine Rolle. Im selben Kontext darf allerdings jeder Parameter nur einmal übergeben werden, d. h. alle xsl:with-param, die gemeinsam auftreten, müssen verschiedene Zielparameter besitzen. Gleichnamige Wertübergaben sind verboten, auch wenn einer, mit tunnel="yes", an den Tunnelstrom und der andere direkt erfolgen soll.
Wertermittlung wie bei xsl:variable
Im Inneren von xsl:with-param kann ein literaler Ausdruck oder ein Template-Block stehen, der ausgewertet und an den Zielparameter übergeben wird. Die Instruktion xsl:with-param geht bei der Auswertung des Template-Blocks vom gleichen Current Node aus, der für das umgebende Element (xsl:call-template, xsl:apply-templates oder xsl:apply-imports) gültig ist.
Falls die Instruktion leer ist, also keinen Template-Block enthält, so ergibt sich der übergebene Wert aus dem select-Attribut. Ist auch dieses nicht vorhanden, so wird als Parameterwert ein leerer String übergeben.
In diesem Sinne ist das Zustandekommen des Übergabewerts identisch mit der Erzeugung eines Variablenwerts bei xsl:variable.
Beispiel: Ein Zähler mit rekursivem Template-Aufruf
Sollen die Anzahl der Durchläufe eines Templates gezählt werden, so gibt es dazu nicht die simple Methode, eine Zählervariable zu setzen:
for(i=0; i<10; i++){ ... tu etwas zehnmal ... }
Dies lässt sich in XSLT nicht so einfach formulieren (Anmerkung: Unter Verwendung von xsl:for-each gibt es hierfür in XPath 2.0 einen einfachen Trick, der in Zusammenhang mit den Stylesheet-Funktionen gezeigt wird), was eine Folge der Freiheit von Seiteneffekten ist. Die Iteration eines Zählers können Sie aber durch Rekursion simulieren. Es muss nur ein benanntes Template dazu veranlasst werden, sich selbst aufzurufen und sich den jeweils letzten Zählerstand als Eingabeparameter zu übergeben:
<xsl:template name="zaehler">
<xsl:param name="der_zaehler" select="0"/>
<xsl:variable name="neuer_zaeh¬ler">
<xsl:value-of select="$der_zaehler + 1"/>
</xsl:variable>
<xsl:if test="$neuer_zaehler < 10">
<xsl:call-template name="zaehler">
<xsl:with-param name="der_zaehler" select="$neuer_zaehler"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
Unabdingbar ist die xsl:if-Bedingung oder eine ähnliche Konstruktion am Ende. Nur so können Sie eine »Endlosschleife« verhindern, in der sich das Template unaufhörlich immer wieder selbst aufruft. Es muss also, wie bei jeder herkömmlichen Schleife auch, eine Abbruchbedingung formuliert werden. Die gleiche Vorsichtsmaßnahme ist andernorts auch bei normalen WHILE oder DO WHILE-Schleifen erforderlich.
Hier folgt das Zähler-Template, angereichert mit ein paar Kommentaren:
<xsl:template name="zaehler">
<!-- beim Start ist der Zähler 0: -->
<xsl:param name="der_zaehler" select="0"/>
<!-- neue Variable – hier wird gezählt: -->
<xsl:variable name="neuer_zaehler">
<xsl:value-of select="$zaehler + 1"/>
</xsl:variable>
<!-- Abbruchbedingung prüfen: -->
<xsl:if test="$neuer_zaehler < 10">
<!-- Template wieder aufrufen -->
<xsl:call-template name="zaehler">
<!-- den Zählerstand übergeben: -->
<xsl:with-param name="der_zaehler" select="$neuer_zaeh¬ler"/>
<!-- überschreibt den Defaultwert -->
</xsl:call-template>
</xsl:if>
</xsl:template>
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