Zusätzliche Standardattribute ab XSLT 2.0

(Auszug aus "XSLT 2.0 & XPath 2.0" von Frank Bongers, Kapitel 6.)

Wie bereits erwähnt, dürfen in XSLT 2.0 allen Deklarationen und Instruktionen – neben den nach wie vor gültigen xml:lang und xml:space – eine Reihe von weiteren Standardattributen beigefügt werden. Diese sind in jedem Fall optio­nal. Es handelt sich um die drei namensraumbezogenen Attribute exclude-result-prefixes, extension-element-prefixes und xpath-default-namespace, sowie um die zwei verarbeitungsbezogenen Attribute default-collation und use-when. Darüberhinaus darf auch das version-Attribut nun ebenfalls jedem XSLT-Element zugeordnet werden.

Bei Verwendung modularer Stylesheets ist zu beachten, dass sich die Gültigkeit dieser Attribute auf das lokale Modul beschränkt, in dem sie gesetzt sind.

Das version-Attribut ist für jedes XSLT-Element gestattet:
Die XSLT-Version jeder einzelnen Deklaration oder Instruk­tion innerhalb des Stylesheets darf ab XSLT 2.0 grundsätzlich mit Hilfe des version-Attributs deutlich gemacht werden. Für alle Elemente mit Ausnahme von xsl:stylesheet bzw. xsl:transform (dort obligatorisch) ist sein Einsatz allerdings optional.

default-collation

Wert

URI-String

Verwendung

Optional, Standardattribut

Einführung

XSLT 2.0

In XPath-Ausdrücken muss für Stringvergleiche oder Sortierungen stets auf eine Vergleichsvorschrift für Zeichenketten, eine sogenannte Collation zurückgegriffen werden – normalerweise ist dies die »Unicode Codepoint Collation«, ein Stringvergleich findet somit anhand der Codepoints der jeweils verglichenen Zeichen statt.

Mittels des default-collation-Attributs kann eine im Bereich des gekennzeichneten Elements für XPath-Ausdrücke alternativ einzusetzende Collation angegeben werden. Hierfür wird ein URI-String übergeben, der die Collation kennzeichnet.

Das Attribut erlaubt die Übergabe mehrerer, durch Leerzeichen getrennter Collation-URIs – dies hat den Hintergrund, dass das Erkennen der Collationangabe stark von der Implementierung des Systems anhängig ist, ein Prozessor also die Liste durchgehen können muss, bis er eine Collation "erkennt". Es ist sinnvoll, als letzte Collation die Unicode Codepoint Collation anzugeben, da diese in jedem Fall unterstützt wird, und so kein Fehler provoziert wird.

Betroffen ist ebenso das Verhalten von Instruktionen xsl:key und xsl:for-each-group im Gültigkeitsbereich des Attributs, nicht aber das Verhalten von xsl:sort (das generell die Default Collation verwendet).

Anmerkung: In XPath 1.0 wird stets nach Codepoints verglichen. Die Wahl einer anderen Vergleichs- oder Sortiervorschrift ist nicht möglich.

Weitere Informationen:
RFC 4790 (März 2007) enthält Vorschläge für die globale Benennung von Collation-URIs: ftp://ftp.rfc-editor.org/in-notes/rfc4790.txt

exclude-result-prefixes

Wert

tokens | "#default" | "#all"

Verwendung

Optional, Standardattribut

Einführung

XSLT 2.0

Das Attribut exclude-result-prefixes dient dazu, das Kopieren von Namensraumpräfixen und den dazugehörigen Namensräumen ins Ergebnisdo­kument zu unterbinden. Dies geschieht durch Nennung der betreffenden Prä­fixe mittels einer durch Leerzeichen (Whitespace) getrennten Tokenliste. Alle an die genannten Präfixe gebundenen Namensraum-URIs gelten als ausge­schlossen (excluded).

Auch der Default-Namensraum – mit Hilfe des Pseudoattributs xmlns (ohne beigefügtes Präfix) deklariert – kann durch den Ausdruck #default der Aus­schlussliste hinzugefügt werden.

Mittels des Kürzels #all können alle Namensräume ohne Ausnahme vom Kopieren ins Ergebnisdokument ausgeschlossen werden. In diesem Fall wer­den weitere, in der Tokenliste genannte Präfixe nicht ausgewertet.

Die Ausschlussliste ist ab einschließlich des Elements, in dem das entspre­chende Attribut steht, für den gesamten von diesem abstammenden Style­sheetzweig gültig.

Nur im aktuellen Stylesheetmodul gültig:
Befindet sich das Attribut exclude-result-prefixes im xsl:stylesheet-Element, so erstreckt sich seine Gültigkeit nicht auf in dieses importierte oder inkludierte externe Stylesheetmodule.

extension-element-prefixes

Wert

tokens | "#default"

Verwendung

Optional, Standardattribut

Einführung

XSLT 2.0

Elemente innerhalb von XSLT-Stylesheets können als Erweiterungsinstruktio­nen gekennzeichnet werden. Sie werden dafür an einen speziellen Namens­raum gebunden, der im Wurzelelement des Stylesheets deklariert wird. Zusätz­lich wird der deklarierte Namensraum in der Tokenliste des Attributs extension-element-prefixes aufgeführt und so als den Erweiterungsin­­struktionen zugehörig erklärt. Dies verhindert gleichzeitig, dass der entspre­chende Namensraum in das Ergebnisdokument kopiert wird.

Die Kennzeichnung eines Namensraumpräfixes gilt ab einschließlich dem das Attribut enthaltenden Element für den gesamten von diesem abstammenden Stylesheetzweig. Das Attribut arbeitet kumulativ, d.h. die erneute Anwendung auf einen Teilzweig des Geltungsbereichs addiert die neuen Deklarationen zu den vorhandenen, statt diese zu überschreiben. Der Default-Namensraum der xmlns-Deklaration kann der Tokenliste hinzugefügt werden. Da er kein Präfix besitzt, wird er durch den Wert #default bezeichnet.

Nur im aktuellen Stylesheetmodul gültig:
Wird das Attribut extension-element-prefixes im Wur­zelelement xsl:stylesheet eingesetzt, so bezieht sich seine Gültigkeit – ana­log zum zuvor beschriebenen Attribut exclude-result-prefixes – nur auf das aktuelle Stylesheetmodul, nicht auf von diesem importierte oder inkludierte externe Stylesheets.

use-when

Wert

xpath-expression

Verwendung

Optional, Standardattribut

Einführung

XSLT 2.0

Auch das neue Attribut use-when kann in XSLT 2.0-Stylesheets für alle XSLT-Elemente eingesetzt werden. Als Wert wird ein XPath-Ausdruck verwendet, der nach Auswertung in einem booleschen Wert resultiert – entsprechend wird das markierte Element und sein Inhalt bei der Verarbeitung des Stylesheets berücksichtigt (use-when="true") oder ignoriert (use-when="false").

Für einen Verarbeitungsdurchlauf können so nach Prüfung von Randbedingungen (z.B. Versionsstand des Prozessors, Verfügbarkeit bestimmter Funktionen oder Schema-Typen) einzelne Instruktionen, ganze Templateblöcke oder sogar komplette Stylesheetmodule von der Verarbeitung ausgeschlossen oder im Gegenteil, hinzugezogen werden – dies ist insbesondere dann von Vorteil, wenn ein Stylesheet durch den Prozessor vor der Verarbeitung kompiliert und entsprechend abgespeichert werden kann (Saxon ist hierzu in der Lage).

Das Attribut wird in der Phase des Einlesens des Stylesheets ausgewertet (static analysis phase), noch bevor auf das Auftreten statischer Fehler geprüft wird oder ein Quelldokument hinzugezogen werden muss. Aus diesem Grund sind die Kontextinformationen, die zur Prüfung eingesetzt werden können, auf jene des statischen Kontexts beschränkt – beispielsweise dürfen im XPath-Ausdruck von use-when keine Variablen referenziert werden (diese sind nicht instantiiert, auch wenn sie in-scope sind), es können keine Schema-Typen aus importierten Schemas getestet werden (denn der Import findet erst später statt), nicht die Verfügbarkeit von Stylesheetfunktionen geprüft (wohl aber auf Erweiterungsfunktionen des Prozessors selbst) und auch nicht die Verfügbarkeit externer Text- oder XML-Ressourcen (diese werden erst später eingebunden).

Die nahelegendste Information, auf die in diesem Zusammenhang zugegriffen werden kann, ist die vom Prozessor unterstützte XSLT-Version, die über die system-property()-Funktion in Erfahrung gebracht wird. Dieser Templateblock wird nur dann eingelesen, wenn mindestens XSLT 2.0 unterstützt wird und ansonsten ignoriert:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="beispiel" use-when="number(system-property('xsl:version')) &gt;= 2.0">
    ... <!-- nur für XSLT 2.0-Prozessoren und neuer -->
  </xsl:template>
...

Vorsicht bei alten Prozessoren im vorwärtskompatiblen Modus
Ein XSLT 1.0-Prozessor, der (im vorwärtskompatiblen Modus) versucht ein XSLT 2.0-Stylesheet mit use-when-Attributen zu interpretieren, wird dieses Attribut (da ihm unbekannt) ignorieren. Er würde den oben stehenden Templateblock ausführen. Hier kann jedoch mit dem, auch alten Prozessoren geläufigen priority-Attribut von xsl:template nachgeholfen werden.

Im folgenden Beispiel wird das use-when-Attribut vom aktuellen Prozessor beachtet, wohingegen der alte Prozessor das ihm zugedachte Template (spätestens zur Laufzeit) mittels des priority-Attributs erkennt:

<xsl:template match="beispiel" priority="5" use-when="number(system-property('xsl:version')) &gt;= 2.0">
  <!-- Ein XSLT 2.0-Prozessor liest dieses Template ein. Ein XSLT 1.0-Prozessor erkennt niedrigere Priorität. -->
</xsl:template>
<xsl:template match="beispiel" priority="10" use-when="number(system-property('xsl:version')) = 1.0">
  <!-- Ein XSLT 2.0-Prozessor ignoriert dieses Template. Ein XSLT 1.0-Prozessor erkennt die höhere Priorität. -->
</xsl:template>

Anmerkung: Bei einem neuen Prozessor tritt kein Konflikt durch das priority-Attribut auf, das er das zweite Template gar nicht erst einliest, dieses also zur Laufzeit nicht existiert. Die angegebene Priorität des erkannten Templates ist daher in diesem Fall irrelevant.

version

Wert

"1.0" | "2.0" ... etc.

Verwendung

Optional, Standardattribut

Einführung

allgemeines Standardattribut seit XSLT 2.0

Das version-Attribut dient dazu, dem XSLT-Prozessor die Versionsnummer der XSLT-Spezifikation zu nennen, auf den sich die Instruktion oder Deklaration bezieht, die das Attribut trägt. Im Wurzelelement xsl:stylesheet eingesetzt, bestimmt es die für das gesamte Stylesheet geltende XSLT-Version.

Mit Hilfe des version-Attributs können nunmehr für einzelne Instruktionen und ihre Inhalte individuelle XSLT-Versionsstände deklariert werden (ein XSLT 1.0-Prozessor beachtet die Attribute selbstverständlich nicht).

Bedeutsam ist das version-Attribut in Zusammenhang mit der Steuerung des rückwärts- bzw. vorwärtskompatiblen Stylesheetverhaltens. Innerhalb eines XSLT 2.0-Stylesheet wird durch ein version-Attribut mit Wert kleiner als "2.0" (mit anderen Worten bei einem Wert von "1.0") für die entsprechende Instruktion stets eine so genannte »rückwärtskompatible Verarbeitung« gemäß XSLT 1.0 erzwungen. Ist der Wert dagegen größer als "2.0", wird das Element auch von einem XSLT 2.0-Prozessor nach den Regeln für vorwärtskompatibles Verhalten verarbeitet.

Anmerkung: Es ist nicht erforderlich, dass alle Module eines Stylesheets die gleiche Versionsnummer tragen. Der Prozessor kann sein Verhalten durchaus für einzelne Module oder sogar einzelne Instruktionen umstellen.

xpath-default-namespace

Wert

URI-String

Verwendung

Optional, Standardattribut

Einführung

XSLT 2.0

Das Attribut deklariert einen innerhalb von XPath-Ausdrücken zu verwen­denden Default-Namensraum für alle Elemente ohne Namensraumpräfix. Das Attribut wirkt sich somit auf die Interpretation von XPath-Pat­tern aus.

Attributwert von xpath-default-namespace ist ein URI, der diesen Namens­raum bezeichnet. Grund für die Einführung des Attributs sind Probleme mit XPath-Ausdrücken, die – bei gleichzeitigem Vorhandensein eines xmlns-Default-Namensraums – auf Elemente ohne Präfix zielen.

Erklärung:
Bei einem NameTest auf ein präfixloses Element wird von vornherein stets ein so genannter Null-Namensraum angenommen (der expan­ded name entspricht dann dem local name) und auf diesen hin überprüft. Ein mit xmlns="http://defaultnamensraum" deklarierter Default-Namensraum, der ansonsten im Dokumentkontext für Elemente ohne Präfix gilt, wird im XPath-Kontext nicht ausgewertet, sodass in diesem Fall das gesuchte Element nicht erkannt würde.

Der mit xpath-default-namespace definierte Namensraum gilt ab einschließ­lich dem Element, in dem das Attribut steht, für den ganzen von diesem abstammenden Zweig. Er kann aber innerhalb von Teilzweigen durch neue Deklarationen überschrieben werden. Der Wert des Attributs gilt nicht auf der Attribut- und Namensraumachse.

Im Rahmen von XPath-Ausdrücken bezieht er sich nur auf Bezeichner von Elementen innerhalb eines NameTests, nicht aber auf andere Bezeichner, die QNames sind, beispielsweise Funktionen, Variablen oder im Rahmen der XSLT-Funktion key() aufgerufene Bezeichner.

Im folgenden Beispiel gilt der Default-Namensraum von xpath-default-namespace für das select-Pattern in xsl:for-each:

<xsl:template match="buch" xpath-default-namespace="http://beispiel.org/buch">
  <xsl:for-each select="kapitel">
    <!-- verarbeitet <kapitel> im genannten Namensraum -->
  </xsl:for-each>
</xsl:template>

Einsatz bei Literal Result Elements

Alle hier beschriebenen Attribute dürfen gleichermaßen für Literal Result Elements verwendet wer­den, müssen aber zu diesem Zweck, wie XSLT-Instruktionen durch das Präfix xsl als zum XSLT-Namensraum zugehörig gekennzeichnet werden, müssen in diesem Fall daher als xsl:use-when, xsl:default-collation, xsl:exclude-result-prefixes, xsl:extension-element-prefixes und xsl:xpath-default-namespace geschrieben.

Hinweis zu den folgenden Erläuterungen der XSLT-Elemente
Da das version-Attribut sowie die in diesem Abschnitt erläuterten Standardattribute ab XSLT 2.0 generell für jedes XSLT-Element eingesetzt werden dürfen, sind sie in der folgenden alphabetischen Übersicht nicht pro Elementerläuterung eigens aufgeführt!

   

<< 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