xsl:namespace

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

A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

 

Die Instruktion xsl:namespace dient zur Erzeugung eines Namensraumknotens in der Ergebnissequenz.

Klassifizierung Instruktion
Funktionsgruppe Output im Ergebnisdokument erzeugen
Einführung XSLT 2.0

Position im Stylesheet und erlaubte Inhalte:

Die Instruktion xsl:namespace darf überall innerhalb von Template-Regeln verwendet werden. Sie enthält einen Templatebody in Form eines Sequenzkonstruktors für den URI-String des Namensraums. Zu dessen Konstruktion dürfen beliebige XSLT-Instruktionen oder Textliterale verwendet werden, die als Ergebnis einen String ergeben. Alternativ kann für den gleichen Zweck das select-Attribut eingesetzt werden – dieses ist sogar obligatorisch, sobald die Instruktion leer ist.

Attribute:

Neben den bekannten Standardattribute besitzt die Instruktion xsl:namespace ein obligatorisches Attribut name und ein (meist) optionales select-Attribut.

name

Wert

{ncname} (auch als AVT)

Verwendung

Obligatorisch

Einführung

XSLT 2.0

Das name-Attribut bestimmt den Bezeichner des erzeugten Namensraumknoten – mit anderen Worten das Präfix, wie es in der Deklaration im Ergebnisdokument verwendet werden soll.

Der Wert kann durch ein Attributwert-Template bestimmt werden. Es muss sich entweder um einen NCName handeln, der damit nicht den Doppelpunkt als Zeichen enthalten darf, oder um den leeren String. In letzterem Fall wird dem Namensraum-URI kein Präfix zugeordnet (was dem Default-Namensraum entspricht). Verboten ist als Wert einzig die Zeichenkette »xmlns«.

Die reservierte Zeichenkette »xml« darf als Wert hingegen verwendet werden (Anmerkung: Dies ist eine Abweichung von früheren Working Drafts der Spezifikation). In diesem Fall muss der erzeugte Namensraum-URI jedoch den Stringwert "http://www.w3.org/XML/1998/namespace" besitzen – andernfalls wird der statische Fehler ERR XTDE0925 gemeldet. Das gleiche gilt umgekehrt, sobald der eben erwähnte URI zugewisen werden soll, das sich aus dem name-Attribut ergebende Präfix jedoch nicht »xml« lautet.

Hinweis: Ist das Präfix für den Knoten, dem der Namensraum zugeordnet wird, bereits in Zusammenhang mit einem anderen Namensraum-URI in Gebrauch, so darf der Prozessor den übergebenen Bezeichner durch einen beliebigen, generierten Präfix substituieren. Dies gilt nicht als Fehler.

select

Wert

xpath-expression

Verwendung

Optional (für leere Instruktion obligatorisch)

Einführung

XSLT 2.0

Das select-Attribut bestimmt, alternativ zu einem, in der Instruktion erlaubten Sequenzkonstruktor, den URI-String des Namensraums. Ist das select-Attribut vorhanden, so muss die Instruktion xsl:namespace leer sein (bzw. darf ausschließlich xsl:fallback-Instruktionen enthalten). Umgekehrt ist für die leere Instruktion das Attribut select obligatorisch zu setzen – ein Verstoß gegen diese Regel ist ein statischer Fehler (ERR XTSE0910).

Verwendungszweck:

In der Regel ergibt sich ein Namensraumknoten im Ergebnisdokument auto­matisch beim Erzeugen (oder Kopieren) eines Element- oder Attributknotens, der sich im Gül­tigkeitsbereich (Scope) einer Namensraumdeklaration befindet.

Die Anweisung xsl:namespace dient dazu, einen Namensraumknoten explizit zu generieren. Obwohl der Einsatz der Instruktion selten erforderlich sein wird (s. o.), wurde hier eine in XSLT 1.0 prinzipiell bestehende Lücke in den XSLT-Instruktionen zur Knotenerzeugung geschlossen (eine Alternative, die in XSLT 1.0 praktikabel ist, wird in Beispiel 2 gezeigt).

Benötigt wird die Instruktion xsl:namespace sobald ein Namensraum-URI oder das benötigte Präfix erst zur Laufzeit bestimmt wird und der gewünschte Namensraum weder im Quelldokument noch im Stylesheet selbst vorhanden ist.

Die xsl:namespace-Instruktion kann ein bestimmtes Präfix an einen Namens­raum-URI binden, sodass dieser beim Zuordnen der Präfixe an die im Ergebnis­dokument gültigen Namensräume nicht anderweitig belegt werden kann.

Ansonsten steht es dem XSLT-Prozessor frei, im Rahmen des Namespace-Fixups bei der Serialisierung des Dokumentes jedem durch einen Namens­raumknoten repräsentierten Namensraum-URI eines (d.h. ein beliebiges aus dieser Gruppe) der Präfixe zuzuordnen, die für diesen zur Verfügung stehen. Diese Zuordnung kann allerdings erst erfolgen, wenn der Ergebnisbaum komplettiert ist und allen Elementen und Attributen diejenigen Namensraum­knoten zugeordnet sind, die für sie »in Scope« sind.

Der Prozessor darf dabei jedoch keine Inkonsistenz in Bezug auf fest zugeord­nete Namensraumpräfixe zulassen. Eine solche feste Zuordnung erfolgt außer durch Verwendung der xsl:namespace-Instruktion auch bei der Anwendung von xsl:copy oder xsl:copy-of auf Namensraumknoten. Sind Präfixe derge­stalt fest belegt, muss der Prozessor für die anderen Namensraum-URIs auf andere Präfixe ausweichen.

Der durch den Sequenzkonstruktor oder das select-Attribut erzeugte URI-String des Namensraumkno­tens darf kein leerer String sein. In diesem Fall wird ein Fehler gemeldet (ERR XTDE0930). Die Folge hieraus ist, dass mittels dieser Instruktion keine Namensraum-Undeklaration (namespace undeclaration) möglich ist – hierzu setzen Sie global das Attribut undeclare-prefixes="yes" für die Instruktion xsl:output, welche die Serialisierung des Ergebnisdokuments vornimmt.

Beispiele:

Beispiel 1– Erzeugung eines Namensraumknotens:

<xsl:namespace name="xsd">http://www.w3.org/2001/XMLSchema</xsl:namespace>

erzeugt im Ergebnisdokument eine Namensraumdeklaration der Form:

xmlns:xsd="http://www.w3.org/2001/XMLSchema"

Beispiel 2 – Erzeugung eines Namensraumknotens in XSLT 1.0:

In XSLT 1.0 steht die Instruktion xsl:namespace nicht zur Verfügung. Muss ein Namensraumknoten erzeugt werden, bzw. besteht die Möglichkeit, dass ein Stylesheet mit xsl:namespace von einem älteren Prozessor verarbeitet wird, so kann die Erzeugung des Namensraums folgendermaßen forciert werden:

<!-- (Stylesheet 2.0, also Vorwärtskompatibler Modus) -->
<xsl:template name="machNamensraum">
  <!-- Aufruf vor Erzeugung eventueller Kindknoten! -->
  <xsl:namespace name="mein" select="'http://www.beispiel.com/namensraum'">
    <!-- XSLT 1.0-Prozessor führt Fallback aus: -->
    <xsl:fallback>
      <xsl:attribute name="mein:egal" namespace="'http://www.beispiel.com/namensraum'">bla bla bla</xsl:attribute>
    </xsl:fallback>
  </xsl:namespace>
</xsl:template>
  

Im Vorwärtskompatiblen Modus führt der XSLT 1.0 Prozessor den Fallback-Block der ignorierten Anweisung xsl:namespace aus (ein Fallback-Block muss jedoch für den FC-Mode vorhanden sein, sonst wird ein Fehler gemeldet!).  Hier erzeugt er damit zwar eigentlich einen Attributknoten, der den gewünschten Namensraum erhält. Der Attributknoten kann in Folge ignoriert werden (sein Name und Wert sind daher irrelevant), der gleichzeitig deklarierte Namensraum führt jedoch dazu, dass auch der gewünschte Namensraumknoten erzeugt wird (sofern dieser Namensraum im Bereich der Instruktion bereits gültig ist – in diesem Fall wird nur das Attribut erzeugt).

Elementdefinition:

XSLT 1.0:

Element in XSLT 1.0 nicht verfügbar.

XSLT 2.0:

<!-- Category: instruction -->
<xsl:namespace
     name = { ncname }
     select? = expression >

     <!-- Content: sequence-constructor -->
</xsl:namespace>

Querverweise:

Knotenkonstruktoren für die restlichen Knotentypen existieren in Form von xsl:attribute, xsl:element, xsl:comment, xsl:processing-instruction und xsl:text.

   

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