XPath 3.0, XPath 2.0, XPath 1.0 / XPath Funktionen / XPath: Sequence - Funktionen / XPath: data

XPath: data

XPath: data

Die data() Funktion liefert die atomisierten Werte einer Sequenz: jeder Node wird also durch seinen Wert ersetzt.

XPath: data

Das folgende Beispiel generiert eine Sequenz aus mehreren Elementen ("//name" kommt aus dem XML Input, $v/E/attribute::* ist eine Attributliste). Während bei der Auswertung von "//name" im Grunde "//name/text()" ausgegeben wird, das in <xsl:value-of select="./text()" /> auch gezielt aufgerufen werden kann, würde dieser ./text()-Aufruf bei den Attributen einen leeren Output ergeben.


 <xsl:attribute-set name="aset1">
  <xsl:attribute name="a1">a1</xsl:attribute>
  <xsl:attribute name="a2">a2</xsl:attribute>
 </xsl:attribute-set>
 <xsl:template name="data_function">
  <Namensliste>
   <xsl:variable name="v">
    <E xsl:use-attribute-sets="aset1" />
   </xsl:variable>
   <xsl:for-each select="(//name, $v/E/attribute::*)">
    <wert>
     <xsl:value-of select="./text()" />
    </wert>
   </xsl:for-each>
  </Namensliste>
 </xsl:template>

Die Ausgabe ergäbe folgendes Resultat:


   <Namensliste>
     <!-- ... -->
     <wert>Muehelos</wert>
     <wert>Leinenlos</wert>
     <wert/>
     <wert/>
   </Namensliste>

data() atomisiert nun diese Sequenz, so daß unterschiedslos mit den Einzelwerten gearbeitet werden kann. Freilich würde eine Auswertung dieser atomisierten Sequenz mit <xsl:value-of select="./text()" /> eine Fehlermeldung verursachen: "Fatal Error! Required item type of first operand of '/' is node(); supplied value has item type xs:anyAtomicType".


 <xsl:template name="data_function">
  <Namensliste>
   <xsl:variable name="v">
    <E xsl:use-attribute-sets="aset1" />
   </xsl:variable>
   <xsl:for-each select="data((//name, $v/E/attribute::*))">
    <wert>
     <xsl:value-of select="." />
    </wert>
   </xsl:for-each>
  </Namensliste>
 </xsl:template>

Das Resultat ist nun wie gewünscht:


   <Namensliste>
      <!-- ... -->
      <wert>Muehelos</wert>
      <wert>Leinenlos</wert>
      <wert>a1</wert>
      <wert>a2</wert>
   </Namensliste>

wg / 29. Dezember 2017



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

Mobil: 0151. 750 360 61 * eMail: info2018@wilfried-grupe.de

www.wilfried-grupe.de/data.html