XPath- und XSLT-Funktionen allgemein
(Auszug aus "XSLT 2.0 & XPath 2.0" von Frank Bongers, Kapitel 5.)
Innerhalb eines XSLT-Stylesheets sind im Rahmen von XPath-Ausdrücken (Expressions) verschiedene Funktionen einsetzbar, die für Zählungen, Berechnungen, zur Stringuntersuchung und -manipulation, zur Informationsabfrage über Knoten und Vieles mehr verwendet werden. Die Funktionen übernehmen beim Aufruf eine fest definierte Anzahl von Argumenten und liefern ihren Rückgabewert an den Ausdruck zurück, in dem sie aufgerufen wurden.
Formale Einteilung in XPath- und XSLT-Funktionen
Bei der Herkunft der Funktionsdefinitionen sind formal die Funktionen, die aus der XPath/XQuery-Spezifikation stammen, von jenen zu unterscheiden, die in XSLT definiert sind.
Für die Verwendung in XSLT-Stylesheets muss bezüglich ihrer Verfügbarkeit zwischen beiden keine Unterscheidung vorgenommen werden. Wird ein XPath-Ausdruck jedoch außerhalb des XSLT-Kontexts ausgewertet (wie z.B. in reinen XQuery-Anwendungen), so können lediglich die innerhalb von XPath-definierten, sogenannten XPath-Core-Funktionen eingesetzt werden.
Erweiterungsfunktionen
Für XSLT-Prozessoren können durch den jeweiligen Hersteller auch prozessorspezifische Erweiterungsfunktionen zur Verfügung gestellt werden. In diesem Fall muss die Funktion mit einem QName (qualifizierten Bezeichner) benannt sein, der mit einem Namensraumpräfix und dazugehörigem, nicht leerem Namensraum-URI versehen sein muss. Auf diese Weise wird sichergestellt, dass keine Kollisionen mit derzeit oder in Zukunft definierten XPath-Funktionen erfolgen können.
Eine gängige, weitestgehend prozessorunabhängige Sammlung von Erweiterungsfunktionen, die mit einer ganzen Reihe von XSLT-Prozessoren lauffähig sind – Voraussetzung ist die Installation des entsprechenden Erweiterungspakets – wird von EXSLT zur Verfügung gestellt. Die kostenlosen Open-Source-Erweiterungen sind in verschiedene Module gruppiert, in denen jeweils mathematische Funktionen, Nodeset-Funktionen, Datumsfunktionen und andere zusammengefasst sind.
Viele dieser EXSLT-Funktionen sind innerhalb von XPath 2.0/XQuery 1.0 in den allgemeinen Standard übernommen worden. Die oft identische Funktionalität kann mit ihrer Hilfe allerdings bereits in einer entsprechend erweiterten XSLT 1.0-Umgebung zur Verfügung stehen.
Beispiele:
saxon:evaluate() ist eine Erweiterungsfunktion, die der XSLT-Prozessor Saxon zur Verfügung stellt, wobei das Präfix saxon an den Namensraum-URI "http://saxon.sf.net/" gebunden sein muss.
Die EXSLT-Erweiterungsfunktion math:min() ist Teil des EXSLT-Math-Moduls. Ihr Präfix math ist an den URI "http://exslt.org/math" gebunden. Die Funktionen der anderen EXSLT-Module besitzen jeweils andere Präfixe und Namensräume.
Stylesheet-Funktionen
Ab XSLT 2.0 ist es dem Autor eines XSLT-Stylesheets möglich, mittels der Deklaration xsl:function eigene Funktionen zu definieren. Diese können während der Laufzeit des Stylesheets innerhalb der XPath-Ausdrücke verwendet werden. Sie werden deshalb als Stylesheet-Funktionen bezeichnet.
Auch in diesem Fall muss der QName der definierten Funktion ein Namensraumpräfix besitzen, das auf einen nicht leeren Namensraum-URI zeigt. Es sollte durch Fallbackoptionen (alternativ zur Stylesheet-Funktion ausführbare abwärtskompatible Routinen) sichergestellt sein, dass auch ältere Prozessoren das Stylesheet ohne Fehlermeldung verarbeiten können.
Stylesheet-Funktion statt Erweiterungsfunktion
Mit einer Stylesheet-Funktion kann auch die Funktionalität einer Erweiterungsfunktion nachgebildet werden. Erhält die Stylesheet-Funktion den gleichen qualifizierten Bezeichner wie die Erweiterungsfunktion, so ist das Stylesheet (theoretisch) auch außerhalb einer erweiterten Umgebung lauffähig (sofern diese Stylesheet-Funktionen unterstützt). In diesem Fall übernimmt die Stylesheet-Funktion die Aufgabe der Erweiterungsfunktion.
Bei gleichem Bezeichner wird gewöhnlich die prozessoreigene Erweiterungsfunktion der gleichnamigen Stylesheet-Funktion vorgezogen, was auch Sinn macht, da Erstere systemnäher programmiert und daher performanter sein wird.
Der Stylesheet-Funktion kann bei der Deklaration jedoch auch ausdrücklich Vorrang vor einer vorhandenen gleich benannten Erweiterungsfunktionen gewährt werden. Notwendig ist dies, wenn eine Stylesheet-Funktion anstelle einer implementierten Erweiterungsfunktion verwendet und beispielsweise mit einer anderen Anzahl von Funktionsargumenten (arity) oder anders typisierten Eingangsgrößen versehen werden soll.
Überladen von Funktionen in XSLT/XPath
Die Koexistenz zweier gleich benannter Stylesheet-Funktionen mit unterschiedlicher Anzahl von Argumenten ist möglich. Die jeweils aufzurufende Funktion wird durch die Anzahl der beim Aufruf übergebenen Parameter identifiziert.
Namensräume für Funktionen
- XSLT 1.0 und XSLT 2.0:
Die in beiden Versionen von XSLT definierten Funktionen befinden sich automatisch im XSL-Namensraum, auch ohne dass dies explizit (durch ein Präfix) ausgedrückt wird.
- XPath 1.0:
Die in XPath 1.0 definierten Funktionen sind ebenfalls automatisch im XSL-Namensraum, auch ohne dass dies explizit (durch ein Präfix) ausgedrückt wird.
- XPath 2.0:
XPath 2.0/XQuery verwendet für Funktionen einen eigenen Namensraum (standard function namespace), üblicherweise an das Präfix fn: gebunden:
xmlns:fn="http://www.w3.org/2005/xpath-functions"
Aufruf einer XPath/XSLT-Funktion
Ein Funktionsaufruf erfolgt im Rahmen eines XPath-Ausdrucks. Generell wird der Funktionsname (als QName, gegebenenfalls mit Präfix für die Namensraumbindung), gefolgt von einem Argumentklammerpaar verwendet:
funktionsname()
prefix:funktionsname()
Der XSLT 2.0-Prozessor Saxon versteht den Aufruf von Funktionen aus dem XPath-Core nach wie vor auch ohne vor den Funktionsnamen vorangestelltes Präfix fn (Werden die Funktionen mit Präfix fn: aufgerufen, was ebenfalls möglich ist, so muss für Saxon im Stylesheet ausdrücklich auch der dazugehörige Namensraum deklariert sein!).
Der XSLT 2.0-Prozessor, den die Suite AltovaXML enthält, ist der Funktionsnamensraum ebenfalls vordefiniert, sodass der Programmierer einerseits auf das fn-Präfix ganz verzichten, dieses aber auch verwenden kan, ohne explizit den Namensraum zu deklarieren. Andere Implementierungen müssen hier in Zukunft jedoch nicht unbedingt folgen.
Für XSLT-Funktionen wird beim Aufruf grundsätzlich kein Präfix benötigt. Da sowohl Stylesheet- als auch Erweiterungsfunktionen über einen eigenen Namensraum samt unterscheidbarem Präfix verfügen müssen und auch dergestalt aufgerufen werden, besteht hier auch bei potenziell gleich benannten Funktionen keine Verwechselungsmöglichkeit.
Argumente beim Funktionsaufruf
Eine Funktion kann beim Aufruf Argumente übergeben bekommen, deren Anzahl, Reihenfolge und Werttypen für jede Funktion genau festgelegt sind:
funktionsname(argument1, argument2)
Eine Reihe von XPath- und XSLT-Funktionen existieren mit verschiedenen Funktionssignaturen, die eine unterschiedliche Anzahl von Parametern entgegennehmen. Den so als optional definierten Parametern kann die leere Sequenz als Argument übergeben werden. (Dies ist vergleichbar, jedoch nicht identisch mit der Übergabe eines leeren Strings an Funktionen unter XPath 1.0). Die Übergabe von mehr Argumenten als von der Funktionsdefinition her vorgesehen, verursacht hingegen mit Sicherheit einen Fehler.
Einzig bei der Funktion fn:concat(), die beliebige, ihr übergebene Strings zu einem Ergebnisstring zusammenfügt, ist die Argumentanzahl (arity) unbestimmt.
Der Datentyp eines übergebenen Arguments wird von der Funktion gegebenenfalls in den geforderten Typ konvertiert, beispielsweise in einen Booleschen Wert, einen String oder eine Zahl. Erst wenn dies nicht möglich ist, wird ein Fehler gemeldet.
<< 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