xsl:attribute

(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:attribute erzeugt ein Attribut in Zusammenhang mit einem gerade in den Ergebnisbaum eingefügten Elementknoten. Der Attributname wird über das name-Attribut der Instruktion bestimmt. Der Wert des Attributs ergibt sich aus dem Sequenzkonstruktor im Inneren des Containers.

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

Position im Stylesheet und erlaubte Inhalte:

xsl:attribute tritt entweder innerhalb eines Sequenzkonstruktors bzw. Templateblockes in xsl:template auf, das einen Elementknoten im Ergebnisbaum erzeugt, oder innerhalb einer xsl:attribute-set-Definition.

Das Element enthält einen (optionalen) Templatekörper in Form eines Sequenzkonstruktors, dessen Auswertung den übergebenen Attributwert bestimmt. Im einfachsten Fall wird der gewünschte Attributwert hier als Literal Result Element eingetragen. Alternativ hierzu kann der Stringwert des erzeugten Attributs über das select-Attribut erzeugt werden.

Attribute:

Es gelten die Standardattribute. Darüberhinaus besitzt die Instruktion xsl:attribute in XSLT 1.0 ein obligatorisches Attribut name und ein optionales Attribut namespace. Der Wert beider Attribute kann sich aus einem Attributwert-Template ergeben. In XSLT 2.0 kommen als optionale elementspezifische Attribute select und – wahlweise alternativ zu verwenden – validation und type hinzu.

name

Wert

QName (auch als AVT)

Verwendung

Obligatorisch

Einführung

XSLT 1.0

Das name-Attribut der Anweisung ergibt den Bezeichner des erzeugten Attributs. Aus diesem Grund muss es sich um einen qualified name handeln. Der Bezeichner kann ein Namespacepräfix beinhalten, dessen Namespace im xsl:attribute-Element angegeben werden kann.

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 Attribut beigegeben. Dabei wird entweder ein innerhalb des name-Attributs vorgegebener Präfix verwendet oder ein Präfix erzeugt.

select

Wert

xpath-expression

Verwendung

Optional

Einführung

XSLT 2.0

Mittels des XPath-Ausdrucks des select-Attributs kann der Stringwert des erzeugten Attributs bestimmt werden. Hierfür wird die Ergebnissequenz des Ausdrucks in einen String umgewandelt; gegebenenfalls unter Berücksichtigung des Werts des optionalen separator-Attributs. Ist ein select-Attribut vorhanden, so muss die Instruktion leer sein, d.h., es darf sich nicht gleichzeitig ein Sequenzkonstruktor in deren Inneren befinden.

Wird die Instruktion in abwärtskompatiblem Modus eingesetzt, so wird nur das erste Item der Sequenz als Grundlage für den Stringwert verwendet.

separator

Wert

string (auch als AVT)

Verwendung

Optional

Einführung

XSLT 2.0

Wird das separator-Attribut eingesetzt, so wird dessen Wert als Trenner zwischen den Items der als Grundlage des effektiven Attributwerts dienenden Sequenz verwendet, wie sie durch select oder den Sequenzkonstruktor erzeugt wurde. Defaultwert ist ein einzelnes Leerzeichen (#x20), wenn die Sequenz mittels des select-Attributs erzeugt wurde, hingegen ein leerer String, wenn dies mittels eines Sequenzkonstruktors geschehen ist.

type

Wert

QName (eines Schematyps)

Verwendung

Optional

Einführung

XSLT 2.0

Das Attribut ist optional, darf jedoch nicht gleichzeitig mit dem validation-Attribut verwendet werden. Das type-Attribut nennt den QName eines Schema-Datentyps gegenüber dem der erzeugte Attributknoten validiert werden soll. Es kann sich um einen vordefinierten (built-in) Typ oder um einen Typ aus einem importierten Schema handeln. Ist die Validierung erfolgreich, d.h., hat das validity-Property des entsprechend erzeugten PSVI den Wert "valid", so wird der Datentyp mit dem Attributknoten verknüft, andernfalls wird die Verarbeitung des Stylesheets abgebrochen.

Es ist ein Fehler, wenn sich der hier übergebene QName auf einen komplexen Datentyp (complex type) bezieht, da ein solcher Typ einem Attributknoten keinesfalls zugewiesen werden darf.

validation

Wert

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

Verwendung

Optional

Einführung

XSLT 2.0

Das Attribut ist optional, darf jedoch nicht gleichzeitig mit dem type-Attribut verwendet werden. 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.

Die vier möglichen expliziten Werte sind "strict", "lax", "preserve" und "strip". Sie haben für xsl:attribute im Einzelnen folgende Wirkungen:

  • validation="strict"
    Der Wert "strict" erzwingt eine strikte Validierung des erzeugten Attributs gemäß eines Schemas. Das Attribut muss also in einem Schema deklariert sein, das an dieser Stelle mit Hilfe der in XML Schema üblichen Methoden zur Verfügung stehen muss. Das validity-Pro­perty des entsprechend für den Attributknoten erzeugten PSVI muss den Wert "valid" besitzen. Hat das Property den Wert "invalid" oder "not­Known", 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 Attributs gemäß eines zur Verfügung stehenden Schemas. Allerdings ist es kein Fehler, wenn kein solches Schema zur Verfügung steht oder das Attribut im Rahmen eines vorhandenen Schemas nicht deklariert ist. Das ermittelte validity-Property des PSVI darf also neben "valid" auch den Wert "notKnown" besitzen. In letzterem Fall wird dem (nicht vali­dierten) Attributknoten der Typ xs:untypedAtomic 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 Zusamenhang mit erzeugten Attributknoten ist dies jedoch nicht sinnvoll, weshalb die Verwendung des Wertes "pre­serve" hier in der Wirkung dem Wert "strip" gleicht: Dem Attributknoten wird der Datentyp xs:untypedAtomic zugewiesen.
  • validation="strip"
    Der Wert "strip" weist dem erzeugten Attributkno­ten den Typ xs:untypedAtomic zu. (Anmerkung: Normalerweise würde jegliche eventuell vorhandene Datentypbindung gelöst – im Zusammenhang mit xsl:attribute ist das Bestehen einer Bindung allerdings ausgeschlossen.)

Verwendungszweck:

Die Anweisung xsl:attribute steht immer in Zusammenhang mit einem Element­knoten, der unmittelbar vorher in der Resultatsequenz auftreten muss (dazwischen dürfen sich höchstens weitere Attribut- oder Namensraumknoten befinden). Dieser Element­knoten kann entweder durch xsl:copy, xsl:element oder durch ein Literal Result Element erzeugt worden sein.

Der Attributknoten muss in der Resultatsequenz vor allen Kindknoten dieses betreffenden Elementknotens auftreten (umfasst auch Weißraumtextknoten). Man spricht davon, dass der entsprechende Elementknoten offen ist. Der aus XSLT 1.0 stammende Hintergedanke hierbei ist, es dem Prozessor auf diese Weise zu ermöglichen, ein Ergebnisdokument Knoten für Knoten unmittelbar zu serialisieren.

Befindet sich vor dem erzeugten Attributknoten ein weiterer Attributknoten­mit gleichem QName (dies ist gestattet und kann sich z.B. aus der Auswertung eines Attributsets ergeben), so wird dieses vorangehende Attribut durch das neu erzeugte überschrieben.

Der Wert des erzeugten Attribute ergibt sich entweder aus der Auswertung des Ausdrucks des select-Attributs oder aus dem Inhalt des optionalen Temp­latebodys, der in xsl:attribute enthalten sein kann. Dieser besteht in einfa­chen Fällen aus einer Zeichenkette, darf aber auch XSLT-Instruktionen enthal­ten, deren Auswertung wiederum einen String ergibt (z.B. xsl:value-of). Erzeugt der Sequenzkonstruktor andere Ergebnisse als Textknoten, so gilt dies als Fehler. Ist weder ein select-Attribut noch ein Sequenzkonstruktor vorhan­den, so erhält das Attribut als Wert den leeren String.

Alternativen zu xsl:attribute:

Anstelle von xsl:attribute kann vereinfa­chend ein Attributwert-Template innerhalb eines Literal Result Elements ver­wendet werden. Hierbei muss jedoch auf eine Typbindung bzw. Validierung des erzeugten Attributknotens verzichtet werden. Die beiden Alternativen sehen folgendermaßen aus (der gewünschte Wert ist in einem Attribut namens wert des aktuellen Knotens):

1. mit der Instruktion xsl:attribute:

<ergebnis>
  <xsl:attribute name="testattribut">
    <xsl:value-of select="@wert"/>
  </xsl:attribute>
</ergebnis>

2. mit Attributwert-Template:

<ergebnis testattribut="{@wert}"/>

Oft ist also ein Attributwert-Template die brauchbare, kürzere Alternative zu xsl:attribute. Dies ist dann der Fall, wenn der Bezeichner des zu erzeugen­den Attributs feststeht und keine sofortige Validierung erforderlich ist. Wird der Bezeichner aber erst zur Laufzeit bestimmt und/oder soll validiert werden, so muss stattdessen die Instruktion verwendet werden.

Beispiele

Beispiel 1 – mit xsl:element:

Ein Anweisungsblock in dieser Form

<xsl:element name="ergebnis">
  <xsl:attribute name="testattribut">testwert</xsl:attribute>
</xsl:element>

erzeugt folgende Ausgabe:

<ergebnis testattribut="testwert"></ergebnis>

Beispiel 2 – Verwendung eines Attributwert-Templates:

Der Name des Attributes kann durch ein Attributwert-Template erzeugt werden – hier wird eine Variable ausgelesen:

<xsl:variable name="att-name">testattribut</xsl:variable>
<ergebnis>
  <xsl:attribute name="{$att-name}">testwert</xsl:attribute>
</ergebnis>

Beispiel 3 – Verwendung mit Namensraum:

a) Attribut mit Namensraum unter Angabe eines Präfixes:

<ergebnis>
  <xsl:attribute name="beispiel:test" namespace="http://www.beispiel.de">testwert</xsl:attribute>
</ergebnis>

Der XSLT-Prozessor erkennt den durch Doppelpunkt abgetrennten Teil des Namens als gewünschtes Namensraumpräfix an (mit Xalan):

<ergebnis beispiel:test="testwert" xmlns:beispiel="http://www.beispiel.de"/>

b) Attribut mit Namensraum – ohne Angabe eines Präfixes:

<ergebnis>
  <xsl:attribute name="test" namespace="http://www.beispiel.de">testwert</xsl:attribute>
</ergebnis>

Der XSLT-Prozessor erzeugt in diesem Fall ein »willkürliches« Namensraumprä­fix (hier ebenfalls Xalan):

<ergebnis ns0:test="testwert" xmlns:ns0="http://www.beispiel.de"/>

Beispiel 4 – Lösung von Namenskonflikten:

Liegt bereits ein gleichnamiges Attribut beim Element vor (dies erfordert auch eine Übereinstimmung im Namensraum!), so überschreibt xsl:attribute den vorhandenen, ersten Attributwert:

<ergebnis testattribut="dies wird überschrieben">
  <xsl:attribute name="testattribut">testwert</xsl:attribute>
</ergebnis>

erzeugt:

<ergebnis testattribut="testwert"></ergebnis>

Es wird keine Fehlermeldung erzeugt! Dieses Verhalten ist erwünscht und in Zusammenhang mit Attributsammlungen, die »en bloc« zugewiesenen Attribu­ten entsprechen, sogar sinnvoll. Werden mehrere Attributsammlungen kombi­niert zugewiesen, so können eventuelle Dopplungen in dieser Weise behandelt werden (siehe xsl:attribute-set).

Elementdefinition:

XSLT 1.0:

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

     <!-- Content: template -->
</xsl:attribute>

XSLT 2.0:

<!-- Category: instruction -->
<xsl:attribute
     name = { qname }
     namespace? = { uri-reference }
     select? = expression
     separator? = { string }
     type? = qname
     validation? = "strict" | "lax" | "preserve" | "strip">

     <!-- Content: sequence-constructor -->
</xsl:attribute>
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