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, Berech­nungen, 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 Unter­scheidung 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-Funktio­nen eingesetzt werden.

Erweiterungsfunktionen

Für XSLT-Prozessoren können durch den jeweiligen Hersteller auch prozessor­spezifische 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 Erweite­rungsfunktionen, die mit einer ganzen Reihe von XSLT-Prozessoren lauffähig sind – Voraussetzung ist die Installation des entsprechenden Erweiterungspa­kets – wird von EXSLT zur Verfügung gestellt. Die kostenlosen Open-Source-Erweiterungen sind in verschiedene Module grup­piert, 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 Funktiona­litä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 verwen­det werden. Sie werden deshalb als Stylesheet-Funktionen bezeichnet.

Auch in diesem Fall muss der QName der definierten Funktion ein Namens­raumprä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 Erweiterungs­funktion nachgebildet werden. Erhält die Stylesheet-Funktion den gleichen qua­lifizierten Bezeichner wie die Erweiterungsfunktion, so ist das Stylesheet (the­oretisch) 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 Ers­tere 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 typi­sierten Eingangsgrößen versehen werden soll.

Überladen von Funktionen in XSLT/XPath

Die Koexistenz zweier gleich benannter Stylesheet-Funktionen mit unterschied­licher 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 automa­tisch im XSL-Namensraum, auch ohne dass dies explizit (durch ein Präfix) aus­gedrü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 Namens­raumbindung), 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 eige­nen Namensraum samt unterscheidbarem Präfix verfügen müssen und auch dergestalt aufgerufen werden, besteht hier auch bei potenziell gleich benann­ten 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 entge­gennehmen. 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) unbe­stimmt.

Der Datentyp eines übergebenen Arguments wird von der Funktion gegebe­nenfalls in den geforderten Typ konvertiert, beispielsweise in einen Boole­schen 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