xsl:element

(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:element dient zum Erzeugen von Elementknoten. Bezeichner und Namensraum des erzeugten Elements können hierbei mittels Attributwert-Template dynamisch bestimmt werden.

Klassifizierung Instruktion
Funktionsgruppe Output ins Ergebnisdokument
Einführung XSLT 1.0

Position im Stylesheet und erlaubte Inhalte:

xsl:element gehört zu den Instruktionen und tritt innerhalb von Sequenzkonstruktoren bzw. Templateblöcken auf.

xsl:element kann leer sein, falls ein leeres Element erzeugt werden soll. In der Regel ist ein Templatekörper in Form eines Sequenzkonstruktors enthalten, der den Elementinhalt erzeugt. Hierfür dürfen beliebige XSLT-Instruktionen und Literal Result Elements verwendet werden.

Attribute:

Für xsl:element gelten die Standardattribute. Die Instruktion besitzt zudem ein obligatorisches name-Attribut sowie die optionalen Attribute namespace, use-attribute-sets, sowie (ab XSLT 2.0) die optionalen Attribute inherit-namespaces, type und validation.

inherit-namespaces

Wert

"yes" (Default) | "no"

Verwendung

Optional

Einführung

XSLT 2.0

Das Attribut inherit-namespaces legt über die Werte yes oder no fest, ob Namensraumknoten an Kindknoten des erzeugten Elementknotens, wie sie mittels des Sequenzkonstruktors im Inneren der Instruktion erzeugt werden können, vererbt werden, oder nicht.

Als Defaultwert bei Abwesenheit des Attributs gilt yes. Normalerweise werden daher Namensraumknoten, unabhängig ob sie konstruiert oder kopiert wurden, vererbt. Wird der Wert hingegen auf no gesetzt, so werden keine Namensräume an Kindelemente vererbt – dies kann bei der Serialisierung durch die explizite Un-Deklarationen von Namensräumen (in der Form xmlns="" oder vergleichbar) realisiert werden.

Hinweis: Das Attribut existiert nicht in XSLT 1.0.

name

Wert

{QName} (auch als AVT)

Verwendung

Obligatorisch

Einführung

XSLT 1.0

Das name-Attribut der Anweisung ergibt einen QName, den Bezeichner des erzeugten Elements. Der Bezeichner kann demzufolge ein Namensraumpräfix beinhalten, dessen Namensraum-URI mit Hilfe des namespace-Attributs festgelegt werden kann. Der Elementname kann dynamisch mittels eines Attributwert-Templates bestimmt werden.

namespace

Wert

{URI-reference} (auch als AVT)

Verwendung

Optional

Einführung

XSLT 1.0

Das namespace-Attribut dient zum Übergeben eines Namensraum-URI. Dieser Namensraum wird dem erzeugten Element beigegeben. Dabei wird entweder ein innerhalb des name-Attributs vorgegebenes Präfix verwendet oder ein Präfix erzeugt. Auch der Namensraum-URI kann dynamisch mittels eines Attributwert-Templates erzeugt werden.

type

Wert

QName

Verwendung

Optional

Einführung

XSLT 2.0

Das type-Attribut nennt den QName eines Schema-Datentyps, der mit den kopierten Element- und Attributknoten verknüpft werden soll. Es kann sich um einen vordefinierten (built-in) Typ oder um einen Typ aus einem importierten Schema handeln. Es ist ein statischer Fehler, wenn keine Deklaration dieses Namens auffindbar ist. Ist die Validierung erfolgreich, d.h., hat das validity-Property des entsprechend erzeugten PSVI den Wert valid, so wird der genannte Datentyp mit dem Elementknoten verknüft, andernfalls wird die Verarbeitung des Stylesheets abgebrochen.

Hinweis: Das type-Attribut darf bei xsl:element nicht gleichzeitig mit dem validation-Attribut eingesetzt werden. Das Attribut existiert nicht in XSLT 1.0.

use-attribute-sets

Wert

QNames

Verwendung

Optional

Einführung

XSLT 1.0

Das use-attribute-set-Attribut dient dazu, Attributsets zu importieren. Als Werte sind die durch Leerzeichen getrennten QNames bestehender Attributsets gestattet. Bei konkurrierenden, gleichnamigen Attributen in mehreren importierten Attributsets gilt das zuerst importierte; ausschlaggebend ist die Reihenfolge in der QName-Liste.

validation

Wert

"strict" | "lax" | "preserve" | "strip"

Verwendung

Optional

Einführung

XSLT 2.0

Das validation-Attribut bestimmt die Validierungsstufe. Der Default­wert bei Abwesenheit des Attributs ist strip, sofern nicht im xsl:styles­heet-Element ein default-validation-Attribut mit anderem Wert gesetzt ist.

Hinweis: Das validation-Attribut darf bei xsl:element nicht gleichzeitig mit dem type-Attribut eingesetzt werden. Es existiert nicht in XSLT 1.0.

Die vier möglichen expliziten Werte sind strict, lax, preserve und strip – sie haben für xsl:element im Einzelnen folgende Wirkungen:

  • validation = "strict"
    Der Wert strict erzwingt eine strikte Validierung des erzeugten Elementknotens gemäß eines Schemas. Das Element muss also in einem Schema deklariert sein, das an dieser Stelle mit Hilfe der in XML Schema üblichen Methoden zur Verfügung stehen muss. Die Deklara­tion kann dabei auch implizit über den für den Knoten verwendeten Namensraum ermittelt werden. Das sich für den Elementknoten ergebende validity-Property im Rahmen des entsprechenden PSVI muss den Wert valid besitzen. Hat das Property den Wert invalid oder notKnown, so schlägt die Transformation an dieser Stelle mit einem Typfehler (type error) fehl.
  • validation = "lax"
    Der Wert lax erfordert ebenfalls eine Validierung des erzeugten Elementknotens gemäß eines zur Verfügung stehenden Sche­mas – allerdings ist es kein Fehler, wenn kein solches Schema zur Verfügung steht bzw. das Element im Rahmen eines vorhandenen Schemas nicht dekla­riert ist. Das für den Elementknoten ermittelte validity-Property darf also neben valid auch den Wert notKnown besitzen. In letzterem Fall wird dem (nicht validierten) Element der Typ xs:untyped zugewiesen. Hat das validity-Property dagegen den Wert invalid, so schlägt die Transforma­tion an dieser Stelle mit einem Typfehler (type error) fehl.
  • validation = "preserve"
    Der Wert preserve erhält normalerweise die Bindung an einen bestimmten Datentyp, sofern dieser bei Erzeugung des Knotens explizit erfolgt ist. Im Zusammenhang mit durch xsl:element erzeugte Elementknoten ist dies jedoch nicht sinnvoll, weshalb die Verwen­dung des Wertes preserve hier in der Wirkung dem Wert strip gleicht: Dem Elementknoten wird der Datentyp xs:anyType zugewiesen.
  • validation = "strip"
    Der Wert strip weist dem erzeugten Element­knoten den Typ xs:untyped zu. (Normalerweise wird durch den Wert strip jegliche eventuell vorhandene Datentypbin­dung gelöst – im Zusammenhang mit durch xsl:element erzeugten Elementknoten ist das vorherige Bestehen einer Bin­dung allerdings ausgeschlossen.)

Verwendungszweck:

Die Anweisung xsl:element fügt dem Ergebnis­dokument einen Elementknoten hinzu. Ist dessen benötigter Bezeichner oder Namensraum nicht im Vorfeld festzulegen, so ist die Verwendung von xsl:element die einzige Möglichkeit zum Erzeugen des gewünschten Ele­ments. Sowohl Elementname als auch dessen Namensraum können jeweils durch Auswertung eines Attributwert-Templates zur Laufzeit des Stylesheets bestimmt werden. Liegt der Elementname dagegen fest, kann allerdings der Einsatz von xsl:copy oder eines Literal Result Elements die einfachere Lösung zur Erzeugung von Elementknoten sein.

Der Templatebody im Inneren der Instruktion dient als Sequenzkonstruktor für den Inhalt des Elements, also seiner Kindelemente oder seines Textinhalts. Hierfür sind beliebige XSLT-Instruktionen und die Verwendung von Literal Result Elements zulässig.

Benötigte Attribute werden dem neu erstellten Element entweder aus weiter oben im Stylesheet definierten Attributsets mittels des Attributs use-attri­bute-sets oder, dann im Rahmen des Sequenzkonstruktors, mit der Instruk­tion xsl:attribute hinzugefügt. Letzteres muss in jedem Fall geschehen, bevor das Element mögliche Kindknoten (Text oder Elemente) erhält. Treten dabei bei den vergebenen Attributen Namensdopplungen auf, so gilt der Wert des zuletzt hinzugefügten Attributs dieses Namens. Attribute, die mit xsl:attribute erzeugt werden, überschreiben deshalb stets namensgleiche, die aus Attributsets stammen.

Da der gewählte Bezeichner des Elements ein QName ist, darf er (muss aber nicht!) ein Namensraumpräfix besitzen. Falls ein solches Präfix vorhanden ist, muss es sich auf eine für diese Stelle des Stylesheets gültige Namensraumdekla­ration beziehen. Das erzeugte Element erhält automatisch einen entsprechen­den Namensraumknoten.

Das Präfix muss sich dagegen nicht auf einen im Stylesheet existierenden Namensraum beziehen, wenn gleichzeitig mit Hilfe des namespace-Attributs ein Namensraum-URI übergeben wird. Das erzeugte Element wird in jedem Fall mit dem übergebenen Namensraum-URI assoziiert, wobei der Parser die­sen in der Regel mit dem im name-Attribut verwendeten Präfix verknüpft. Dem Parser steht es jedoch frei, ein anderes Präfix zu vergeben, falls dies erforderlich sein sollte.

Beispiele:

Beispiel 1 – Erzeugen eines Elements:

<xsl:variable name="der_name">mein_element</xsl:variable>
<xsl:element name="{$der_name}"/>

erzeugt im Ergebnisdokument:

<mein_element/>

Der Elementname wird mittels eines Attributwert-Templates aus einer Variable ausgelesen.

Beispiel 2 – Verschachtelte Anwendung von xsl:element:

<xsl:element name="buch">
  <xsl:element name="titel">Finnegan's Wake</xsl:element>
  <xsl:element name="autor">James Joyce</xsl:element>
</xsl:element>

erzeugt im Ergebnisdokument:

<buch>
  <titel>Finnegan's Wake</titel>
  <autor>James Joyce</autor>
</buch>

Beispiel 3 – Mit übergebenem Namensraum:

<xsl:element name="galileo:buch" namespace="http://www.galileocomputing.de">
  <xsl:element name="titel">Einstieg in XML</xsl:element>
  <xsl:element name="autor">Helmut Vonhoegen</xsl:element>
</xsl:element>

erzeugt im Ergebnisdokument:

<galileo:buch xmlns:galileo="http://www.galileocomputing.de">
  <titel>Einstieg in XML</titel>
  <autor>Helmut Vonhoegen</autor>
</galileo:buch>

Der Parser fügt im Ergebnisdokument die entsprechende Namens­raumdeklaration hinzu.

Beispiel 4 – Verschachtelt mit übergebenem Namensraum:

Der zu übergebende Namensraum des Elternelements ist nicht im Scope des Stylesheets, also in dessen Inneren zur Laufzeit nicht automatisch gültig. Ver­säumt man die Deklaration des Namensraum-URI für die inneren Elemente, so wird der Parser ihre Erzeugung verwerfen.

<xsl:element name="galileo:buch" namespace="http://www.galileocomputing.de">
  <xsl:element name="galileo:titel" namespace="http://www.galileocomputing.de">Einstieg in XML</xsl:element>
  <xsl:element name="galileo:autor" namespace="http://www.galileocomputing.de">Helmut Vonhoegen</xsl:element>
</xsl:element>

ergibt im Ergebnisdokument:

<galileo:buch xmlns:galileo="http://www.galileocomputing.de">
  <galileo:titel>Einstieg in XML</galileo:titel>
  <galileo:autor>Helmut Vonhoegen</galileo:autor>
</galileo:buch>

Im Ergebnisdokument sind die erzeugten Kindelemente automatisch im Scope des Namensraums des äußeren Elements. Der Parser setzt daher das xmlns-Attribut nur ein einziges Mal.

Elementdefinition:

XSLT 1.0:

<!-- Category: instruction -->
<xsl:element 
     name = { qname }
     namespace = { uri-reference }
     use-attribute-sets = qnames>

     <!-- Content: template -->

</xsl:element>

XSLT 2.0:

<!-- Category: instruction -->
<xsl:element
     name = { qname }
     namespace? = { uri-reference }
     inherit-namespaces? = "yes" | "no"
     use-attribute-sets? = qnames
     type? = qname
     validation? = "strict" | "lax" | "preserve" | "strip">

     <!-- Content: sequence-constructor -->

</xsl:element>
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