XSL-Übersicht / xsl:variable

xsl:variable

xsl:variable

➪ Im XSL übernimmt eine Variable einen temporären Inhalt, der in der Regel zur Laufzeit gesetzt und an passender anderer Stelle wieder ausgelesen wird.

Dieser temporäre Inhalt kann ein einzelner Wert, eine Liste simplen Datentyps sein, ebenso ein externes XML-Dokument (document()), ein komplexer Baum, das Zwischenergebnis einer mehrstufigen Konvertierung: mithin eine komplexe Sequenz (xsl:sequence) von Items.

Im Unterschied zu Variablen in C, C++, C#.NET, Java, VB.NET und zahlreichen anderen Programmiersprachen, in denen x = x + 1 eine durchaus sinnvolle Anweisung ist, übernimmt eine Variable in XSL nur einen temporären Wert, der in der Regel zur Laufzeit gesetzt und anderswo wieder ausgelesen wird. Eine inkrementelle Statusänderung der XSL-Variable ist aber nicht vorgesehen.


<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="xs">
  <xsl:output method="xml" indent="yes" />

Über die document-Funktion können externe XML-Dokumente (die ausdrücklich nicht Teil des XML-Inputs sind) in eine Variable eingelesen werden. Damit umfasst die Variable $vinput beispielsweise einen komplexen XML-Baum oder eine .


<xsl:variable name="vinput"
     select="document('Orte_Elemente.xml')" />

$var1 greift auf den $vinput zu; durch die gezielte XPath-Adressierung beinhaltet $var1 einen normalen Textinhalt.


<xsl:variable name="var1"
     select="$vinput/Orte/Ort[1]/Mensch[2]/Kauf[3]/bez/text()" />

$var2 greift ebenfalls auf $vinput zu. Der Inhalt umfasst ein einziges Element, das seinerseits mehrere Childnodes in sich birgt. Um diese anzusteuern, ist in XPath $var2/Kauf/child::* erforderlich. Die Einzelinformation erhalten Sie über $var2/Kauf/bez.


<xsl:variable name="var2">
    <xsl:copy-of 
         select="$vinput/Orte/Ort[1]/Mensch[2]/Kauf[3]" />
</xsl:variable>

$var3 greift ebenfalls auf $vinput zu. Bedingt durch die XPath-Adressierung, umfasst $var3 mehrere Childnodes: Hier werden mehrere Childnodes direkt zugewiesen, ohne das kapselnde Element Kauf. Angesteuert werden können diese im Loop über $var3/child::*. Die Einzelinformation erhalten Sie über $var3/bez.


<xsl:variable name="var3">
 <xsl:for-each 
    select="$vinput/Orte/Ort[1]/Mensch[2]/Kauf[3]/child::*">
      <xsl:copy-of select="." />
 </xsl:for-each>
</xsl:variable>

Das benannte Template NodeInfo untersucht den jeweils aktuellen Node/Kontext aus verschiedener Sicht. Das Template NodeInfo umfasst keine Parameterzuweisung, sondern bekommt den Kontext ausschließlich zur zugewiesen.


<xsl:template name="NodeInfo">
  <xsl:attribute 
       name="Elementname" 
       select="./local-name()" />
  <xsl:attribute 
       name="wert" 
       select="." />
  <xsl:attribute name="Nodetype">
    <xsl:choose>
     <xsl:when test="./self::text()">Textnode</xsl:when>
     <xsl:when test="./self::element()">Elementnode</xsl:when>
     <xsl:when test="./self::comment()">Kommentarknoten</xsl:when>
    </xsl:choose>
  </xsl:attribute>
  <xsl:attribute name="XSDtype">
   <xsl:choose>
   <xsl:when test=". castable as xs:integer">xs:integer</xsl:when>
   <xsl:when test=". castable as xs:decimal">xs:decimal</xsl:when>
   <xsl:when test=". castable as xs:string">xs:string</xsl:when>
   </xsl:choose>
  </xsl:attribute>
</xsl:template>

<xsl:template match="/"> definiert in diesem Fall den Programmstart. Hier werden die vorher deklarierten Variablen angesprochen und jedes ihrer Childnodes über eine Schleife dem vorher benannten Template NodeInfo übergeben, das die restliche Arbeit übernimmt.


 <xsl:template match="/">
  <ergebnis>
   <var1>
    <xsl:for-each select="$var1/self::text()">
     <xsl:call-template name="NodeInfo" />
    </xsl:for-each>
   </var1>
   <var2>
    <xsl:for-each select="$var2/Kauf/child::*">
     <childelement>
      <xsl:call-template name="NodeInfo" />
     </childelement>
    </xsl:for-each>
   </var2>
   <var2bez>
    <xsl:value-of select="$var2/Kauf/bez"/>
   </var2bez>
   <var3>
    <xsl:for-each select="$var3/child::*">
     <childelement>
      <xsl:call-template name="NodeInfo" />
     </childelement>
    </xsl:for-each>
   </var3>
   <var3bez>
    <xsl:value-of select="$var3/bez"/>
   </var3bez>
  </ergebnis>
 </xsl:template>
</xsl:stylesheet>

xsl:sequence

Eine weitere Alternative zur Variablendeklaration bietet xsl:sequence:


<xsl:variable name="vsequence">
  <xsl:sequence select="//Mensch/vorname"/>
</xsl:variable>
<xsl:for-each select="$vsequence/child::*">
  <vn>
    <xsl:value-of select="."/>
  </vn>
</xsl:for-each>  

Wie , ist es sinnvoll, sich über den Datentyp von Variablen jeweils genau im Klaren zu sein, um Programmierfehler mit weitreichenden Konsequenzen zu vermeiden. Siehe auch: .

Anonyme Funktionen

In XSL 3.0 ist es auch möglich, eine Variable als zu deklarieren.

wg / 31. März 2018



Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf.






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_variablen.html