XSLT - Anwenden von Templates


... [Seminar XML und Java] ... [Thema: XSLT] ... [Aufbau eines Stylesheets] ...


Übersicht: XSLT - Anwenden von Templates


xsl:apply-templates

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

Mittels xsl:apply-templates können Templates angewendet werden. Dabei wird im select-Attribut ein XPath-Ausdruck angegeben, der - ausgehend vom Current Node - die zu bearbeitenden Knoten auswählt. Das Ergebnis ist ein Node Set, das vom XSLT-Prozessor zum weiteren Traversieren des Quelldokuments genutzt wird. Das Node Set wird dabei Element für Element abgearbeitet und jeweils eine entsprechende Template Rule gesucht. Dabei wird das aktuelle Element im Node Set zum Current Node des Prozesses.

Wenn keine Template Rule existiert, werden implizite Regeln angewendet.

Wird kein select-Argument angegeben, beinhaltet das Node Set alle Knoten auf der child-Achse, was folgenden Ausdrücken entspricht: select='child::*' oder select='*'.

Der Parameter mode dient zur weiteren Auswahl der anzuwendenden Template Rule. Beim Aufruf kann die Template Rule mittels des xsl:with-param-Konstrukts mit Parametern versorgt werden. Das Node Set, das durch das select-Attribut gebildet wird, kann mittels xsl:sort nach verschiedenen Kriterien sortiert werden.


Built-in Template Rules

Die eingebauten Template Rules entbinden den Anwender von der Definition des Verhaltens für Character Data oder Elemente, zu denen es kein Template gibt. Diese Regeln besagen, dass dann alle Kindelemente durchwandert werden und für jedes davon implizit wieder ein xsl:apply-templates aufgerufen wird. Trifft der XSLT-Prozessor dann auf Character Data und ist auch hier kein explizites Template definiert, wird implizit xsl:value-of aufgerufen und die Zeichendaten in das Ausgabedokument überführt.

Diese Built-in Template Rules sind für alle Elementtypen definiert:


xsl:call-template

<!-- Category: instruction -->
<xsl:call-template
  name = qname>
  <!-- Content: xsl:with-param* -->
</xsl:call-template>

Mittels xsl:call-template ist es möglich, gezielt bestimmte Template Rules auszuführen. Der Inhalt des Templates wird an der aktuellen Stelle im Zieldokument instanziiert, wobei sich der Current Node des XSLT-Prozessors nicht ändert.

Beispiel:

<xsl:call-template name="tabellenkopf">
  <xsl:with-param name="align">right</xsl:with-param>
</xsl:call-template>


Übergabe von Parametern

<xsl:with-param
  name = qname
  select = expression>
  <!-- Content: template -->
</xsl:with-param>

Im vorigen Abschnitt wurde schon auf die Vereinbarung von Parametern in Template Rules eingegangen. Mittels xsl:with-param wird nun ein Paramter übergeben. Das Attribut name bezeichnet den Parameter. Der Wert des Parameters ergibt sich durch den select-Ausdruck oder durch instanziieren des Templates innerhalb des Konstrukts.

Wird der Wert über das select-Attribut bestimmt, erhält man einen der vier Basistypen (String, Zahl, Boolean oder Node Set) oder, falls erweiterte Funktionen aufgerufen werden, weitere Typen als Ergebnis. Mit diesem Typ wird dann auch weiterhin gearbeitet.

Das Instanziieren des Templates liefert ein Ergebnis vom Typ Result Tree Fragment. Dieser Begriff wird später noch genauer erklärt.

Beispiel:

Folgende Template Rule:

<xsl:template match="image">
  <xsl:param name="align" select="'left'" />
  <img src="org" align="{$align}" />
</xsl:template>

Über

<xsl:apply-templates select="images/image[1]">
  <xsl:with-param name="align" select="'right'"/>
</xsl:with-param>

kann dann der Parameter align mit dem Wert right vom Typ String an die obige Template Rule übergeben werden.


... [Seminar XML und Java] ... [Thema: XSLT] ... [Anwenden von Templates] ... [Aufbau eines Stylesheets] ...