XSL-Übersicht / xsl:element

xsl:element

xsl:element

➪ xsl:element erlaubt die flexible Generierung von Elementnamen. Mit Hilfe von xsl:element ist es möglich, Elemente im Zieldokument zu generieren. Der Vorteil gegenüber fixer Namensdefinition ist, daß der Elementname dynamisch generiert werden kann.

Hilfreich sind auch die Features zur Generierung von oder zur XML Schema - basierten .

Das sehen wir unschwer bei der Konvertierung von Attributen in Elemente. Nehmen wir das folgende XML-Inputdokument, dessen einziges Element lediglich Attribute, aber keine Childnodes aufweist.


<Person nachname="Achim" 
        vorname="Achtlos" 
        Geburtsjahr="1970"/>

Gesucht wird nun ein Weg, sämtliche Attribute in eine Ziel-Struktur zu konvertieren, die ausschließlich Elemente aufweist. Dies wird möglich mit einer Schleife über alle Attribute. Zur Laufzeit wird für jedes vorhandene Attribut ein neues Element generiert, das den Namen des Attributs sowie dessen Wert übernimmt.


<Mensch>
 <xsl:for-each select="/Person/attribute::*">
  <xsl:element name="{name()}">
   <xsl:value-of select="."/>
  </xsl:element>
 </xsl:for-each>
</Mensch>

Das Ergebnis ist:


<Mensch>
   <nachname>Achim</nachname>
   <vorname>Achtlos</vorname>
   <Geburtsjahr>1970</Geburtsjahr>
</Mensch>

Namespaces im XML Input Dokument

Soll dasselbe Ergebnis erreicht werden, wenn der XML Input mit einem Namespace "belastet" ist, ...


<wg:Person 
    xmlns:wg="wilfried-grupe.de" 
    wg:nachname="Zenzi" 
    wg:vorname="Zwecklos" 
    wg:Geburtsjahr="1980"/>

so bietet sich die Arbeit mit child::* und local-name() an:


<Mensch>
 <xsl:for-each 
      select="/*/child::*/attribute::*">  
  <xsl:element name="{local-name()}">
   <xsl:value-of select="."/>
  </xsl:element>
 </xsl:for-each>
</Mensch>

<Mensch>
   <nachname>Zenzi</nachname>
   <vorname>Zwecklos</vorname>
   <Geburtsjahr>1980</Geburtsjahr>
</Mensch>

Timestamp-Elemente

Ebenso ist es möglich, die Elementnamen mit einem Zeitstempel zu versehen (selten benötigt, aber doch verwendet).

Für das folgende Beispiel benötigen wir zum besseren Verständnis zwei Variablen, die die aktuelle Zeitermitteln und zur weiteren Verwendung formatieren.


 <xsl:variable name="vjetzt" 
      select="current-dateTime()"/> 
 <xsl:variable name="vjetztf" 
      select="format-dateTime($vjetzt, 
        '[Y0001][M01][D1]','de','AD','DE')"/>

Diese Zeitstempel kommen nun bei der Generierung der Elementnamen zum Einsatz.


<xsl:element 
     name="element{$vjetztf}">
  <xsl:element name="wg:Tag{$vjetztf}" 
       namespace="http://www.wilfried-grupe.de">
     <xsl:value-of 
          select="day-from-dateTime($vjetzt)"/>
  </xsl:element>
  <xsl:element name="Monat{$vjetztf}">
     <xsl:value-of 
          select="month-from-dateTime($vjetzt)"/>
  </xsl:element>
  <xsl:element 
       name="Jahr{$vjetztf}" 
       namespace="http://www.wilfried-grupe.de" >
    <xsl:value-of 
         select="year-from-dateTime($vjetzt)"/>
  </xsl:element>
</xsl:element>

Interessant ist hier auch der Einsatz der XML Schema - basierten Typkontrolle, die beim xsl:element name="Monat{$vjetztf}" sicherstellt, daß das Ergebnis eine positive Zahl sein muß.

Das Ergebnis lautet:


<element20180112>
  <wg:Tag20180112 
      xmlns:wg="http://www.wilfried-grupe.de">
      12
  </wg:Tag20180112>
  <Monat20180112>1</Monat20180112>
  <Jahr20180112
    xmlns="http://www.wilfried-grupe.de">
    2018
  </Jahr20180112>
</element20180112>

wg / 12. Januar 2018



Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf:

Vorname
Nachname
Mailadresse







Vielen Dank für Ihr Interesse an meiner Arbeit.


V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de

www.wilfried-grupe.de/XSL_element.html