Das Wurzelelement xsl:stylesheet

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

Nun soll das Stylesheet etwas im Detail betrachtet werden. Zunächst handelt es sich, wie man am XML-Prolog erkennt, offenkundig um ein XML-Dokument:

<?xml version="1.0" encoding="ISO-8859-1"?>

Das version-Attribut des Prologs bezeichnet den Versionsstand des im Dokument verwendeten XML. Es besitzt den Wert 1.0, wie derzeit üblich (theoretisch ist auch 1.1 für XML 1.1 erlaubt, jedoch nicht verbreitet). Zusätzlich enthält der Prolog hier noch ein encoding-Attribut, um für den Inhalt des Dokuments den Zeichensatz ISO-8859-1 zu deklarieren.

Das Wurzelelement xsl:stylesheet und seine Namensräume

Nach dem XML-Prolog folgt das Wurzelelement des Stylesheet-Dokuments: xsl:stylesheet. Auch xsl:stylesheet enthält ein version-Attribut, das hier jedoch den Versionsstand der im Stylesheet verwendeten XSLT-Version nennt.

<xsl:stylesheet version="2.0" ... >

Für XSLT 2.0 besitzt das Attribut daher den Wert 2.0. Der einzige weitere erlaubte Wert ist derzeit 1.0 für XSLT 1.0, da die Interimsversion XSLT 1.1 zurückgezogen wurde.

Mit Hilfe des Attributs xmlns wird ein Namens­raum deklariert. In diesem Fall ist mit dem Doppelpunkt als Verbinder nach dem Attributnamen ein weiterer String angefügt. Dieser ist frei wählbar und kennzeichnet als Prä­fix diejenigen Elemente, denen der deklarierte Namensraum zugeordnet wird. Für XSLT hat es sich eingebürgert, hierfür xsl zu verwenden. Es steht hier also xmlns:xsl.

<xsl:stylesheet version="2.0" xmlns:xsl="...">
  ...
</xsl:stylesheet>

Zu beachten ist: Auch das Wurzelelement xsl:stylesheet verwendet bereits das Präfix xsl, obwohl es in ihm erst vereinbart wird. Dies ist korrekt. Ein Namensraum gilt überall in dem Element, für das er vereinbart wurde, sowie auch für das Element selbst.

Der Sinn eines Namensraums

Ein Namensraum dient dazu, ein XML-Element unmissverständlich einer Elementgruppe (einer Markup-Sprache) zuzuordnen. Dies beugt zum einen Konfliken mit Namensdubletten bei gleichzeitiger Verarbeitung mehrerer XML-Dokumente unterschiedlicher Herkunft vor. Zum anderen können so Schlüsselkonzepte bestimmter XML-Anwendungen als einem Bedeutungsraum zugehörig gekennzeichnet wer­den, wie »XML Schema«, »Formatting Objects«, »SVG«, »MathML« – oder eben »XSLT«.

Hierzu dient, vergleichbar mit der Kennziffer eines Personalauswei­ses, eine unverwechselbare Zeichenkette. Weil eben diese Unverwechselbar­keit am einfachsten mit per Definition einzigartigen URI-Strings zu erreichen ist, setzt man diese zur Kennzeichnung von Namensräumen ein – deshalb spricht man auch von einem Namensraum-URI.

Der Namensraum-URI muss nicht auf eine existierende Ressource zeigen:
Es ist eine verbreitetete Fehlannahme, dass ein solcher URI auf eine reale Webressource zeigen müsste. Dies ist nicht der Fall. Tatsächlich kommt es nur auf die unverwechselbare Zeichen­kette als solche an. Eine XSLT-Transformation setzt daher keine Onlineverbindung voraus.

Für XSLT ist dieser URI reglementiert; er muss (kategorisch) der Zeichenkette "http://www.w3.org/1999/XSL/Transform" entsprechen. Nur durch diesen URI-String wird ein Ele­ment, das »in« diesem Namensraum ist, für die verarbeitende Anwendung, den XSLT-Prozessor, eindeutig als XSLT-Instruktion gekennzeichnet.

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  ...
  <!-- Der XSLT-Namensraum gilt hier weiter: -->
  <xsl:template>  ...  </xsl:template>
  ...
</xsl:stylesheet>

Das Präfix selbst ist lediglich Platzhalter bzw. Abkürzung für diesen URI-String. Man könnte daher, obwohl dies unüblich ist, anstelle von xsl auch ein beliebig anders lautendes Präfix verwenden.

Der Gesamtbezeichner des Wurzelelements xsl:stylesheet ist also aus zwei Teilen zusammengesetzt und besteht aus dem lokalen Bezeichner stylesheet und dem Präfixanteil xsl. Durch den Doppelpunkt verbunden, bilden beide Teile den genannten »quali­fizierten Bezeichner« des Elements: seinen QName.

Bei der Verarbeitung spielt nur der Namensraums-URI eine Rolle:
Intern arbeitet eine Anwendung immer mit einem sogenannten »expandierten« QName. Ausschlaggebend ist nie das Präfix, sondern der Namens­raum-URI, für den es steht. Zwei qualifizierte Bezeichner gelten also dann als gleich, wenn sie den gleichen lokalen Bezeichner und den gleichen Namensraum-URI besitzen. Das für den »nicht expandierten« QName verwendete Präfix ist irrelevant.

Sollte ein und derselbe Namensraum-URI gleichzeitig an zwei verschiedene Präfixe gebunden sein (durchaus denkbar im Fall zweier gleichzeitig verarbeiteter Dokumente aus verschiedenen Quellen), gelten in diesem Sinne für den Prozessor auch zwei, auf den ersten Blick unter­schiedliche QNames als gleich.

Beispiel für einen expandierten QName

  • Der nicht expandierte QName des Stylesheet-Elements ist xsl:stylesheet. In dieser Form steht der QName im Quellcode.
  • Der expandierte QName, mit dem intern gearbeitet wird, lautet jedoch {http://www.w3.org/1999/XSL/Transform}:stylesheet.

Dies bedeutet, dass der Prozessor ein in einem QName verwendetes Präfix bei der Verarbeitung im Grunde nicht sieht, sehr wohl aber kennt. Dies ist für die Rückwandlung eines Namensraum-URIs in ein Präfix bei der Serialisie­rung des Ergebnisdokuments von Bedeutung.

Unterscheidung zwischen XSLT 1.0 und 2.0:
Der Namensraum-URI "http://www.w3.org/1999/XSL/Transform" ist für XSLT 1.0 und XSLT 2.0 iden­tisch. Beide Sprachversionen werden nur anhand des Wertes des version-Attributs von xsl:stylesheet unterschieden. Folglich wird mit diesem Attribut also auch indirekt festgelegt, welche XPath-Version innerhalb des Stylesheets genutzt wird.

Weitere sinnvolle Namensraum-Deklarationen

Neben dem hier vorgestellten, obligatorischen XSLT-Namensraum sollten in xsl:stylesheet noch zwei weitere Namensräume deklariert werden. Vorläufig werden wir sie allerdings noch nicht benötigen:

  • Der Namensraum für XPath-Funktionen: xmlns:fn="http://www.w3.org/2005/xpath-functions"

    Dies bezeichnet den Namensraum der XPath-Funktionen, die innerhalb von XPath-Ausdrücken im Stylesheet eingesetzt werden dürfen. Diese sind durch das Präfix fn gekennzeichnet: fn:position()

  • Der Namensraum für XML Schema-Datentypen und Konstruktoren: xmlns:xs="http://www.w3.org/2001/XMLSchema"

    Dies bezeichnet den Namensraum für Datentypen aus XML Schema und deren Konstruktoren (die dazu dienen, eine Instanz eines Typs zu erzeugen): xs:date() erzeugt als Konstruktor einen Datumstyp.

Vollständiger muss das Stylesheet-Element daher wie folgt geschrieben werden.

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  ...
  <!-- Hier ist jetzt auch der Namensraum für XPath-Funktionen und XML Schema bekannt. -->
  ...
</xsl:stylesheet>

Zusammenfassung zu xsl:stylesheet

  • Als Wurzelelement des Stylesheets wird entweder xsl:stylesheet oder (sel­ten, aber funktionsgleich) xsl:transform verwendet.
  • Im Wurzelelement muss die XSLT-Version festgelegt und Namens­räume müssen vereinbart werden; darunter mindestens der für XSLT selbst. Die Versionsnummer ist »2.0« für XSLT 2.0.
  • Die Deklaration der Namensräume für XPath-Funktionen und Schema-Typen ermöglicht die Kennzeichnung von Funktionen und Datentypen durch die Präfixe fn und xs. Dies wird von manchen Prozessoren gefordert.
  • Hier vereinbarte Namensräume sind überall im Stylesheet verfüg­bar. Elemente, denen sie angehören, bekommen zur Kennzeichnung das in der Namensraumdeklaration vereinbarte Präfix vorangestellt.
  • Durch den XSLT-Namensraum werden die XSLT-Instruktionen innerhalb des Stylesheets gekennzeichnet (dies gilt auch für das Wurzelelement selbst, das ebenfalls das Präfix xsl trägt).

In der folgenden Abbildung sind im Inneren des Wurzelelements noch einige derzeit unbekannte Strukturen gezeigt. Zu diesen kommen wir in Kürze. Betrachten wir aber zunächst das Element xsl:template.

Grundstruktur eines XSLT 2.0-Stylesheets

Abbildung: Grundstruktur eines XSLT 2.0-Stylesheets.

   

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