xsl:call-template, name

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

Die Instruktion xsl:call-template dient dazu, aus einem Template-Block heraus ein anderes Template über dessen Namen explizit aufzurufen. Gerufen werden kann durch die Instruktion nur ein Template (in diesem Zusammen­hang spricht man nicht von Template-Regel), das durch ein xsl:template-Ele­ment mit name-Attribut gebildet wird. Ein korrespondierender Wert muss beim name-Attribut von xsl:call-template vorliegen.

Vergleichbar ist dies mit dem Aufruf einer Subroutine, also einem Codeab­­schnitt, der einigermaßen unabhängig vom aufrufenden Kontext bestimmte Dinge tun soll, beispielsweise einen String in Klammern setzen oder Ähnliches. Es wird auch gezeigt, dass diese Instruktion elementar für rekursive Template-Aufrufe ist, gerade in Verbindung mit der Übergabe von Parametern.

Diese Methode steht im Gegensatz zum impliziten Aufruf (Push-Verfahren), der die Knoten einer über xsl:apply-templates zusammengestellten Sequenz sich ihre, für sie jeweils passendeTemplate-Regel selbst suchen lässt. Hier wird dagegen ein über seinen Namen aufgerufenes Template direkt in den Prozess hineingezogen (Pull-Verfahren). Der zu verarbeitende Knoten kann dem Temp­late mittels einer Parameterübergabe mitgeteilt werden, ansonsten wird mit dem aktuellen Knoten der aufrufenden Template-Regel weitergearbeitet.

Der aufrufende Kontext bleibt erhalten

Durch den Aufruf von xsl:call-template bleiben der aktuelle Knoten und die aktuelle Sequenz erhalten – im Gegensatz zu xsl:apply-templates, wo sich beides durch den Aufruf ändert. Der Prozessor nimmt also die Arbeit nach Beenden des aufgerufenen Templates an der gleichen Stelle wieder auf.

Natürlich kann das benannte Template, wie jedes andere Template auch, Inhalte in die Ergebnissequenz ausgeben. Der Sinn einer Subroutine ist aber oft die Rückgabe eines Ergebniswerts an den Ort des Aufrufs der Routine. Eine Funktionalität wie »return« gibt es bei Templates jedoch nicht. Stattdessen können Sie den Aufruf von xsl:call-template mit einer Variablendeklara­tion xsl:variable umgeben, die die erzeugte Sequenz auffängt und als tem­porären Baum speichert.

Die Instruktion ist oft leer, falls das aufgerufene Template mit dem aktuellen Knoten der aufrufenden Template-Regel arbeiten kann oder ausschließlich auf Tunnelparameter des aktuellen Tunnelstroms zugreift. In der Regel wird xsl:call-template jedoch ein oder mehrere xsl:with-param-Instruktionen enthalten, die jeweils einen (durch einen XPath-Ausdruck bestimmten) Wert an einen sich im aufgerufenen Template befindenden Parameterspeicherplatz übergeben. Damit ist eine Parameterübergabe an das aufgerufene Template möglich, sofern xsl:param-Elemente mit korrespondierenden Namen dort existieren.

Der Name des gerufenen Templates muss explizit genannt werden, also »sta­tisch« im Aufruf stehen. Es besteht daher nicht die Möglichkeit, ihn durch eine zur Laufzeit ausgewertete Variable zu ersetzen, etwa um nach Bedarf auf unter­schiedliche Templates zu verweisen. Allerdings werden im name-Attribut von xsl:call-template die dafür benötigten Attributwert-Templates ohnehin nicht ausgewertet.

Wollen Sie diesen Effekt erzielen, so ist es alternativ möglich, mittels xsl:choose zwischen mehreren xsl:call-template-Instruktionen zu wäh­len. Diese müssen jeweils einen der in Frage kommenden Namen besitzen.

Ein mode-Attribut besitzt xsl:call-template im Gegensatz zu xsl:apply-templates nicht. Es besteht nicht die Möglichkeit, auf diese Art beim Aufruf zwischen zwei gleich benannten Templates zu unterscheiden. Da die Steuerung allein über den Namen stattfindet, dürfen folglich keine zwei gleich benannten Templates vorhanden sein. Dies ist besonders für inkludierte Stylesheet-Module von Bedeutung; im Fall importierter benannter Templates greift die Importprä­zedenz und unterdrückt die importierten Dubletten. Im Gegensatz zu deakti­vierten importierten Template-Regeln gibt es keine Möglichkeit, durch Import stillgelegte benannte Templates in irgendeiner Form zu nutzen.

Das Ziel eines Aufrufs, also das benannte Template:

<xsl:template name="mein_template" match="egal">
  ...
</xsl:template>

<!-- wird aufgerufen durch -->
<xsl:call-template name="mein_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