next up previous contents
Nächste Seite: 3.6 Erweiterungsfunktionen Aufwärts: 3 XSLT Vorherige Seite: 3.4 Datenabhängige Verarbeitung   Inhalt


3.5 Funktionen

Wie in Kapitel 3.3 schon ansatzweise erwähnt, stellt XSLT bzw. XPath auch einige Funktionen zur Verfügung. Diese dienen als Unterstützung zur Definition der Bedingungen, die innerhalb von select oder test-Attributen festgeschrieben werden. XPath, als Grundlage der Baumstruktur, liefert neben den verschiedenen möglichen Achsen (siehe Kapitel 3.2.2) auch verschiedenartige Funktionalitäten zur genaueren Spezifikation bestimmter Eigenschaften. Es lassen sich mittels Knotentests bestimmte Sorten von Knoten finden und unterscheiden, so zum Beispiel Text- oder Kommentarknoten. Funktionen zur Bearbeitung von Nummern sorgen dafür, dass verschiedene Knoten umgewandelt und mit ihnen mathematische Operationen durchgeführt werden können. So lassen sich Knotenmengen mit count durchzählen oder auch einfach nur ihre Werte auf beliebige Art und Weise kombinieren. Hierfür stehen gängige Operatoren wie +, -, *, div oder mod bereit. Auch Wahrheitsaussagen lassen sich durch Operatoren wie =, < >, and oder or und den dazugehörigen Funktionen bearbeiten. Mit der boolean()-Funktion lassen sich alle möglichen Objekte in Wahrheitswerte umwandeln und not() dient zur Invertierung der Wahrheitswerte. Diese Wahrheitsaussagen werden besonders bei Tests benötigt, vgl. Kapitel 3.4. Eine weitere wichtige Gruppe von Funktionen dienen der Stringverarbeitung. Abfragen bezüglich der Länge von Strings und dem Auftreten bestimmter Zeichenfolgen an definierten Positionen im String sind besonders für Tests sinnvoll. Das Zerteilen von Strings und das Zusammenfügen und Umwandeln von Zeichen ermöglichen auch eine spezifizierte Stringbearbeitung. Diese gängigen Operationen und Funktionen anderer Programmiersprachen, werden durch speziell auf die Baumstruktur abgestimmte Funktionen ergänzt. Zur Auswahl bestimmter Knoten liefert XPath den Zugriff auf ein Element an einer bestimmten Position (position()). Es lassen sich eindeutige ID's zu Knoten erzeugen und diese an anderer Stelle wiederfinden (id()) bzw. verweisen. Auch die Informationen über den Namen oder den Namensraum eines Knotens, lassen sich abfragen und stehen so zur weiteren Verarbeitung zur Verfügung. Für die Benutzung der Funktionen ist die Unterscheidung nach ihrer Spezifikation in XPath oder XSLT nicht entscheidend. Während XPath allerdings eher die grundsätzlichen Operationen zur Verfügung stellt, liefern die in XSLT definierten Funktionen spezifische Funktionalitäten in Abhängigkeit des Umfangs der eigenen Sprache. So wird mit der Funktion current() der aktuelle Knoten geliefert, in dem gerade die Verabeitung stattfindet. Das ist sehr ähnlich dem per XPath spezifizierten aktuellen Knoten (.) und somit sind diese beiden auch in den meisten Fällen identisch. Allerdings wird der XPath-Ausdruck erst innerhalb seines gesamten Ausdrucks ausgewertet, das heißt der XSLT-Prozessor befindet sich in der Verarbeitung des XPath-Ausdrucks. Wenn dieser ihn bis zu der Stelle, an der der .-Ausdruck ausgewertet wird, zu einem anderen Element umgeleitet hat, so wird an der nun für den Prozessor aktuellen Stelle, der Ausdruck ausgewertet. Anders ist das bei der Verarbeitung der current()-Funktion. Diese gehört zu XSLT und wird somit einzeln ausgewertet. Sollte diese innerhalb eines XPath-Ausdruckes benutzt werden, so steht ihr Ergebnis schon vor Bearbeitung des Ausdruckes fest. Dadurch kann es passieren, dass diese beiden Ausdrücke an bestimmten Stellen unterschiedliche Ergebnisse liefern. Beispiel 3.5.1:
In den meisten Fällen liefern die Ausdrücke . und current() die gleichen Ergebnisse. Beide liefern den Wert des aktuellen Knotens zurück. Innerhalb der Auswertung eines XPath-Ausdrucks kann das jedoch variieren. Mit Benutzung der current()-Funktion wird nur dann der Inhalt des Elementes zurückgeliefert, wenn der aktuelle Knoten ein id-Attribut hat. Die Benutzung von . wird immer den Inhalt des ersten Elementes zurückliefern, das bei der Suche nach einem Element mit id-Attribut gefunden wird.

Identische Ausgabe:

<xsl:value-of select=current()"/>
<xsl:value-of select="."/>

Unterschiedliche Ergebnisse:

<xsl:value-of select="//*[@id=current()/@id]"/>
<xsl:value-of select="//*[@id=./@id]"/>

Damit mit XSLT Auswertungen über verschiedene Dateien gemacht werden können, muss es die Möglichkeit geben mehrere Dokumente gleichzeitig zu bearbeiten. Mittels der document()-Funktion kann auf andere XML-Dokumente zugegriffen werden. Innerhalb dieser Dokumente kann beliebig navigiert und gearbeitet werden, wie es auch in dem Ausgangsdokument der Fall ist. Eine Unterstützung von Dokumenten, die nicht XML-basierend sind, ist auf diese Art nicht machbar. Eine Möglichkeit, dieses Problem zu lösen, wird in Kapitel 3.6 erläutert. Einige XSLT-Funktionen dienen als Spezifizierungsfunktionen für bestimmte Elemente. Das ist beispielsweise bei dem schon in Kapitel 3.4 erwähnten decimal-format-Element der Fall. Innerhalb dieses Elementes wird eine Formatierungsregel definiert, die innerhalb des Stylesheets an beliebigen Stellen wieder verwendet werden kann. Dazu wird mittels der format-number()-Funktion auf sie zugegriffen und die angegebenen Zahlen werden nach den festgelegten Regeln formatiert ausgegeben. Ebenso arbeitet auch die key()-Funktion mit einem Element zusammen. Mittels des key-Elementes lassen sich Schlüssel erzeugen, die mit der key()-Funktion wieder abgerufen werden können. Bei der Schlüsselerzeugung handelt es sich um einen einfachen Zugriff auf eine bestimmte ausgewählte Menge von Knoten. Diese eindeutigen Schlüssel erzeugen damit einen neuen Zusammenhang zwischen Elementen, die in die ausgewählten Knotenmengen gehören. Eine einfachere Zugriffsart ist über die Eindeutigkeit eines jeden Elements möglich. So lässt sich für jedes Element eine eindeutige ID generieren (generate-id()), die innerhalb des gesamten Dokumentes gültig ist. Zu jedem Zeitpunkt der Verarbeitung des XML-Dokumentes mit dem Stylesheet ist die erzeugte ID eines Elementes gleich, allerdings kann sie bei einem erneuten Aufruf des Stylesheets oder eines anderen XSLT-Prozessors variieren. Wichtige Informationen zum verarbeitenden XSLT-Prozessor, lassen sich durch die system-property()-Funktion zur Laufzeit abfragen. Die Versionsnummer zeigt an, welcher Stand von XSLT unterstützt wird. Auch Name und URL des XSLT-Prozessors lassen sich abfragen. Dies ist besonders wichtig, da XSLT zwar eine vom W3C verabschiedete Empfehlung ist, aber dennoch nicht alle XSLT-Prozessoren alle Funktionalitäten implementieren, siehe auch Kapitel 3.3. Durch Bereitstellung der Systemeigenschaften lassen sich somit Vorlagen erstellen, die abhängig vom eingesetzten Prozessor, verschiedene Verarbeitungsanweisungen ausführen. Die XSLT-Prozessoren können auch noch weitere Systemeigenschaften unterstützen, aber die sind von jedem einzelnen XSLT-Prozessor abhängig und nicht standardisiert. Damit die Auswahl der Verarbeitungsschritte nicht vom Namen des eingesetzten Prozessors abhängig ist, gibt es die Möglichkeit die Erreichbarkeit von bestimmten Elementen oder Funktionen abzufragen. Das lässt sich mit den XSLT-Funktionen element-available() und function-available() erreichen. Die Recherchen im Rahmen dieser Diplomarbeit haben ergeben, dass zur Zeit nicht alle XSLT-Prozessoren diese Funktionen unterstützen. Das erschwert die Arbeit besonders flexible und fehlerresistente Stylesheets zu schreiben. Einen großen Einfluß hat dieses auf die Möglichkeit Erweiterungen zu den Standard-Funktionen zu schreiben. Auf diese Erweiterungsfunktionen soll im nächsten Kapitel näher eingegangen werden.
next up previous contents
Nächste Seite: 3.6 Erweiterungsfunktionen Aufwärts: 3 XSLT Vorherige Seite: 3.4 Datenabhängige Verarbeitung   Inhalt
Tanja Schniederberend 2003-06-11