Einfache benannte Templates in XSLT-Funktionen umwandeln

(Auszug aus "XSLT Kochbuch" von Sal Mangano)

Problem

XSLT 1.0 bot keine Unterstützung für das Schreiben von XPath-Funktionen in XSLT, und benannte Templates sind ein ungünstiger Ersatz.

Lösung

Sie sollten XSLT 2.0-Funktionen den benannten Templates vorziehen, wenn die Aufgabe einzig darin besteht, ein Ergebnis zu berechnen, anstatt serialisierten Inhalt zu erzeugen. Im folgenden zeige ich ein Potpourri aus Beispielen, bei denen Funktionen im Vergleich zu benannten Templates viel bequemer sind:

<!-- Mathematische Berechnungen -->
<xsl:function name="ckbk:factorial" as="xs:decimal">
  <xsl:param name="n" as="xs:integer"/>
  <xsl:sequence select="if ($n eq 0) then 1 else $n * ckbk:factorial($n - 1)"/>
</xsl:function>

<!-- Einfache Zuordnungen -->
<xsl:function name="ckbk:decodeColor" as="xs:string">
  <xsl:param name="colorCode" as="xs:integer"/>
  <xsl:variable name="colorLookup" select="('black','red','orange','yellow','green','blue','indigo','violet','white')"/>
  <xsl:sequence select="if ($colorCode ge 0 and $colorCode lt count($colorLookup)) then $colorLookup[$colorCode] else 'no color'"/>
</xsl:function>

<!-- Stringmanipulationen -->
<xsl:function name="ckbk:reverse">
  <xsl:param name="input" as="xs:string"/>
  <xsl:sequence select="codepoints-to-string(reverse(string-to-codepoints($input)))"/>
</xsl:function>

Diskussion

Rufen Sie sich in Erinnerung, dass benannte Templates eine Alternative zu Templates darstellen, die ausschließlich über Filterung aufgerufen werden. Benannte Templates handeln fast wie Prozeduren in transitionalen Sprachen, da ein XSLT-Programmierer die Kontrolle über xsl:call-template ausdrücklich an ein benanntes Template überträgt, anstatt sich auf die deklarativere Semantik der Template-Filterung zu verlassen. Eine nette Eigenschaft von XSLT (sowohl 1.0 als auch 2.0) besteht darin, dass Sie diese Stile mischen können, indem Sie einem Template sowohl ein Muster als auch einen Namen geben.

Benutzerdefinierte XSLT 2.0-Funktionen sind kein Ersatz für benannte Templates. Die Kernfrage, die Sie sich stellen müssen, wenn Sie sich für die eine oder die andere Methode entschließen, lautet: Berechnen Sie einfach nur ein Ergebnis, oder erzeugen Sie wiederverwendbaren Inhalt? Die erste Variante wird als Funktion besser ausgedrückt, die zweite als Template. Im Buch XSLT 2.0 Programmer's Reference empfiehlt Michael Kay, Funktionen in den Fällen zu benutzen, in denen Sie einfach nur Knoten auswählen, und Templates dann einzusetzen, wenn Sie neue anlegen, obwohl XSLT es Ihnen erlaubt, auch dafür Funktionen zu verwenden.

Diese Funktion wählt Knoten aus:

<xsl:function name="getParts" as="item( )*">
  <xsl:param name="startPartId" as="xs:string"/>
  <xsl:param name="endPartId" as="xs:string"/>
  <xsl:sequence select="//Parts/part[@partId ge $startPartId and @partId le $endPartId]"/>
</xsl:function>

Diese Funktion erzeugt neue Knoten, aber wahrscheinlich wäre ein Template für diese Aufgabe sinnvoller:

<xsl:function name="getPartsElem" as="item( )">
  <xsl:param name="startPartId" as="xs:string"/>
  <xsl:param name="endPartId" as="xs:string"/>
  <Parts>
    <xsl:copy-of select="//Parts/part[@partId ge $startPartId and @partId le $endPartId]"/>
  <Parts>
</xsl:function>

  

<< zurück vor >>

 

 

 

Tipp der data2type-Redaktion:
Zum Thema XSLT bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

Copyright © 2006 O'Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "XSLT Kochbuch" 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.

O'Reilly Verlag GmbH & Co. KG, Balthasarstraße 81, 50670 Köln, kommentar(at)oreilly.de