Elementknoten erzeugen mit xsl:element

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

Die Instruktion xsl:element fügt, wie der Name bereits aussagt, der Ergebnis­­sequenz einen Elementknoten hinzu. Sie stellt damit unter anderem eine etwas umständlich erscheinende Alternative zu einem Literal Result Element dar:

<element name="beispiel">Test</element>

könnte abgekürzt werden mit:

<beispiel>Test</beispiel>

Im Gegensatz zu einem Literal Result Element besteht bei der Instruktion aller­dings die Möglichkeit, den Bezeichner des zu bildenden Elements (bei dem es sich um einen QName handeln muss) durch einen XPath-Ausdruck dynamisch zur Laufzeit zu erzeugen.

Einfacher ausgedrückt: Der Name des eingefügten Elements wird mittels eines AVT erst im Augenblick des Erzeugens festgelegt. Also:

<element name="{xpath-ausdruck}">Test</element>

Elementnamen können sich aus der Position eines Elements in der verarbeite­ten Sequenz ergeben. In diesem wegen der wenigen in HTML dafür brauchba­ren Tag-Namen etwas realitätsfernen Beispiel werden entsprechend dimensio­nierte Überschriften <h...> im Ergebnisdokument erzeugt (es dürften dann natürlich nie mehr als sechs Bücher sein):

<regal>
  <buch>Das erste Buch</buch>
  <buch>Das zweite Buch</buch>
  <!-- mehr Bücher -->
  ...
</regal>

Hier ein Ausschnitt aus dem Stylesheet (das Attributwert-Template hängt posi­tionsabhängig eine Ziffer an das »h« an):

...
<xsl:template match="buch">
  <xsl:element name="h{fn:position()}">
    <xsl:value-of select="."/>
  </xsl:element>
</xsl:template>
...

Im Ergebnisdokument:

<h1>Das erste Buch</h1>
<h2>Das zweite Buch</h2>
... 
<h6>Das sechste Buch</h6>

Sie können mit dieser Herangehensweise auch Attributbezeichner in Element­­namen umwandeln, das Ergebnisdokument liegt dann in XML vor. Diese Anwendung hat, im Gegensatz zur vorhin gezeigten, durchaus Realitätsbezug.

Ausgangspunkt ist ein leeres Element <buch> mit mehreren Attributen:

<buch buchtitel="Wenn der Berg ruft" buchautor="Assmann, Peter" buchverlag="Berg Verlag" ersch-jahr="2004"/>

Dies wird folgendermaßen verarbeitet, die Funktion fn:name() liest dabei jeweils den Bezeichner des aktuellen Knoten aus:

<xsl:template match="buch">
  <buch>
    <xsl:for-each select="@*">
      <xsl:element name="{fn:name()}">
        <xsl:value-of select="."/>
      </xsl:element>
    </xsl:for-each>
  </buch>
</xsl:template>

Das Ergebnis ist ein Element <buch>, das keine Attribute mehr, dafür aber eine Reihe von Kindelementen besitzt:

<buch>
  <buchtitel>Wenn der Berg ruft</buchtitel>
  <buchautor>Assmann, Peter</buchautor>
  <buchverlag>Berg Verlag</buchverlag>
  <ersch-jahr>2004</ersch-jahr>
</buch>

Auf ähnlichem Weg lassen sich auch Attributknoten erzeugen.

   

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