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-Re­geln entweder direkt an dort vorhandene Parameter oder (mit tunnel="yes") an den Tunnelstrom, der von den aufgerufenen und diesen wiederum unter­geordneten 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-Ele­ment stehen, also immer vor eventuellen Literal-Result-Elementen oder ande­ren 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 über­geben werden, d. h. alle xsl:with-param, die gemeinsam auftreten, müssen verschiedene Zielparameter besitzen. Gleichnamige Wertübergaben sind ver­boten, 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 Temp­late-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 vorhan­den, 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 veran­lasst 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 &lt; 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 Tem­plate unaufhörlich immer wieder selbst aufruft. Es muss also, wie bei jeder her­kö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 &lt; 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>

Code-Beispiel: kap03/3.01.5/zaehler.xsl.

   

<< 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