xsl:apply-templates

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

A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

 

Die Instruktion xsl:apply-templates wählt, ausgehend vom Kontextknoten, Knoten aus dem Quelldokumentbaum zur Bearbeitung aus. Die so zusammengestellte Nodesequenz kann vor der Weiterverarbeitung sortiert werden.

Klassifizierung Instruktion
Funktionsgruppe Template-Regeln und Aufruf
Einführung XSLT 1.0

Position im Stylesheet und erlaubte Inhalte:

xsl:apply-templates zählt zu den Instruktionen und wird daher nur innerhalb von Sequenzkonstruktoren bzw. Templateblöcken verwendet.

Die Anweisung xsl:apply-templates tritt gewöhnlich als leeres Element auf, kann aber auch die Instruktionen xsl:sort oder xsl:with-param enthalten. Textinhalt oder Literal Result Elements sind nicht gestattet.

Attribute:

Es gelten die Standardattribute. Zusätzlich besitzt die Instruktion zwei elementspezifische Attribute, select und mode, deren Verwendung optional ist.

mode

Wert

QName | "#current" | "#default"

Verwendung

Optional

Einführung

XSLT 1.0

Ein weiteres Attribut, das einzeln oder zusätzlich zu select gesetzt werden kann, ist das mode-Attribut. Ist kein mode-Attribut gesetzt, sind nur Template-Regeln mit Defaultmodus aufrufbar, die also ebenfalls kein mode-Attribut besitzen.

Ist mode gesetzt, so muss sein Wert entweder die Form eines qualifizierten Bezeichners (QName) haben, oder einem der beiden vorgegebenen Werte entsprechen. Bei Einsatz eines QNames können in Folge nur diejenigen Template-Regeln aktiv werden, die ein gleichnamiges mode-Attribut besitzen.

Neben QNames können zur Bezeichnung der Modi der Ziel-Templates zwei weitere vordefinierte Werte – #current und #default – angegeben werden:

  • mode="#current"
    Besitzt die umgebende Template-Regel selbst einen Modus (current mode), so wird dieser nicht automatisch weitergeführt. Dies kann nur explizit über den QName des aktuell gültigen Modus oder implizit mittels des Werts #current erfolgen.
  • mode="#default" (Default)
    Der Vollständigkeit halber kann mit dem Wert #default angezeigt werden, dass die zusammengestellte Sequenz ausschließlich Templateregeln mit Defaultmodus aufrufen soll. Dies entspricht dem Verhalten von xsl:apply-template ohne mode-Attribut.

Anmerkung: Für Template-Modi existieren drei vordefinierte Werte, nämlich #current, #default und #all. Der Wert #all kann jedoch nur als Modus einer Template-Regel eingesetzt werden und ist in diesem Kontext nicht anwendbar.

select

Wert

xpath-pattern

Verwendung

Optional

Einführung

XSLT 1.0

Die Anweisung kann mit Hilfe des select-Attributs gezielt eine Knotenauswahl erstellen. Der Attributwert muss ein gül­tiges XPath-Pattern sein. Der Ergebnissequenz hinzugefügt werden alle Nodes, auf die das Pattern zutrifft.

Ist kein select-Attribut vorhanden, so verhält sich die Instruktion so, als ob das Pattern select="child::node()" vorläge – d.h., ausgewählt werden alle Kindknoten des Kontextknotens.

Verwendungszweck:

Die Instruktion xsl:apply-templates stellt eine Sequenz aus Knoten zusammen, für die bei der nachfolgenden Verarbeitung sukzessive entsprechende Template-Regeln aktiviert werden. Ist das select-Attribut gesetzt, so wird die Nodesequenz anhand des XPath-Pattern zusam­mengestellt. Die Ergebnissequenz kann entsprechend auch leer sein.

Wird xsl:apply-templates ohne select-Attribut verwendet, so wird in Dokumentreihenfolge eine Nodesequenz aller Kindknoten des aktuellen Kno­tens zusammengestellt, also Textknoten (auch reine Whitespace-Nodes!) sowie Element-, Kommentar und PI-Knoten.

Wird xsl:apply-templates ohne select-Attribut verwendet und ist der Kon­text des Aufrufs kein Knoten, so gibt die Instruktion die leere Sequenz zurück.

Der Aufruf einer Template-Regel ist an ihren Modus gebunden. Soll keine Tem­plate-Regel im Defaultmodus aufgerufen werden, so muss der gewünschte Modus, d.h. genau ein Modus. (Anmerkung: Der Aufruf muss eindeutig sein. Im Gegensatz zu xsl:template ist daher keine Liste zulässig.) stets explizit genannt werden. Existiert keine Regel im angege­benen Modus, so wird ein entsprechendes Default-Template verwendet. Den aktuellen Modus der umgebenden Template-Regel gibt xsl:apply-templates dabei nicht automatisch weiter.

Einen Ausnahmefall stellen die eingebauten Default-Template-Regeln dar, die in jedem Fall in Kraft treten, wenn zu einem Knoten keine entsprechende Temp­late-Regel existiert. Der aktuelle Modus spielt hier keine Rolle, wird aber durch das Default-Template (durch implizites xsl:apply-templates) gegebenenfalls an Folge-Templates weitergereicht (man spricht von »sticky mode«). Auf diesem Weg wird sichergestellt, dass ein zur Verarbeitung anstehender Knoten auch in jedem Fall verarbeitet wird.

Verwendung relativer und absoluter XPath-Pattern für select:
Wird ein relatives XPath-Pattern als Wert des select-Attributs ver­wendet, so bezieht sich dieses immer auf den aktuellen Knoten. Dies ist der Regelfall. Es ist aber ausdrücklich möglich, auch ein absolutes, auf den Wur­zelknoten bezogenes Pattern zu verwenden.

Eine Übersicht und Erklärungen der eingebauten Default-Template-Regeln befinden sich bei den Ausführungen zu xsl:template.

Beispiele:

Beispiel 1 – Gezielte Zusammenstellung einer Nodesequenz:

Mit Hilfe des select-Attributs können aus der Nodesequenz aller Children des Kontextknotens bestimmte Knoten herausgegriffen werden:

<xsl:apply-templates select="buch"/>

Die zusammengestellte Sequenz besteht nur aus Child-Elementen <buch> des Current Node. Sie liegt in Dokumentreihenfolge vor.

Auch die Zusammenstellung heterogener Nodesequenzen ist möglich, wenn das XPath-Pattern entsprechend formuliert ist:

<xsl:apply-templates select="buch | cd"/>

stellt – wieder in Dokumentreihenfolge – eine Sequenz aus allen Children <buch> und <cd> des Current Node zusammen.

Beispiel 2 – Zusammenstellung einer sortierten Nodesequenz:

Tritt das Element, wie oben angedeutet, als Container auf, so kann es Sortie­rungsanweisungen xsl:sort enthalten. Die durch xsl:apply-templates zusammengestellte Nodesequenz wird dann vor der Weiterverarbeitung sor­tiert.

<xsl:apply-templates select="buch">
  <xsl:sort select="autor"/>
</xsl:apply-templates>

Hier wird eine Nodesequenz aus <buch>-Elementen vor der Weiterverarbei­tung nach dem Stringwert ihrer <autor>-Elemente sortiert.

Es ist möglich, mittels xsl:with-param an die instanziierte Template-Regel zusätzlich Werte zu übergeben. Zur Übername des Wertes müssen dort ent­sprechende xsl:param-Elemente vorliegen.

<xsl:apply-templates select="buch">
  <xsl:with-param name="farbe" select="red"/>
</xsl:apply-templates>

Hier wird an das verarbeitende Template der String "red" übergeben, der als Farbwert bei der Präsentation verwendet werden soll.

Beispiel 3 – Beschränkung der Verarbeitung auf Kindelemente:

Werden die Kindknoten eines Elements verarbeitet, so ist die mittels xsl:apply-templates (ohne select-Attribut) erzielte Sequenz abhängig davon, ob für das Kontextelement Whitespace-Stripping erfolgt ist oder nicht. Ist dies nicht geschehen, so sind ungewollt Whitespace-Nodes Teil der Sequenz, was beim Zählen der Kindelemente mittels position() stört.

In diesem Fall kann es günstiger sein, die Zusammenstellung der Sequenz auf Elemente zu beschränken. Dies geschieht durch Übergabe des Wildcard-Platz­halters als Pattern:

<xsl:apply-templates select="*"/>

Zu beachten ist, dass sich (wie gewünscht) keine Textknoten in der so zusam­mengestellten Sequenz befinden, jedoch auch keine Kommentar- oder PI-Kno­ten (falls man diese mittels entsprechender Template-Regeln verarbeiten möchte).

Elementdefinition:

XSLT 1.0:

<!-- Category: instruction -->
<xsl:apply-templates 
      select = node-set-expression 
        mode = token>
  <!-- Content: (xsl:sort | xsl:with-param)* -->
</xsl:apply-templates>
  

XSLT 2.0:

<!-- Category: instruction -->
<xsl:apply-templates
   select? = node-sequence-expression
     mode? = token>
  <!-- Content: (xsl:sort | xsl:with-param)* -->
</xsl:apply-templates>
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