current()-Funktion  
Diese Funktion gibt eine Knotenmenge zurück, deren einziger Inhalt der aktuelle Knoten ist.
 
Eingaben

Keine

 
Ausgabe

Eine Knotenmenge, deren einziger Inhalt der aktuelle Knoten ist. Meist ist der aktuelle Knoten derselbe wie der Kontextknoten. Die folgenden zwei XSLT-Elemente haben dieselbe Bedeutung:

<xsl:value-of select="current()"/>
<xsl:value-of select="."/>

Innerhalb eines Prädikatausdrucks sind der aktuelle und der Kontextknoten normalerweise jedoch unterschiedlich. Der nachfolgende Beispielabschnitt zeigt auf, wann der Einsatz der Funktion current() berechtigt ist.

 
Definition

XSLT-Abschnitt 12.4, Diverse zusätzliche Funktionen

 
Beispiel

Die Funktion current() wird zusammen mit einer Tabelle zum Nachschlagen verwendet. Hier das Dokument, das umgewandelt werden soll:

<?xml version="1.0"?>
<report>
  <title>Miles Flown in 2001</title>
  <month sequence="01">
    <miles-flown>12379</miles-flown>
    <miles-earned>35215</miles-earned>
  </month>
  <month sequence="02">
    <miles-flown>32857</miles-flown>
    <miles-earned>92731</miles-earned>
  </month>
  <month sequence="03">
    <miles-flown>19920</miles-flown>
    <miles-earned>76725</miles-earned>
  </month>
  <month sequence="04">
    <miles-flown>18903</miles-flown>
    <miles-earned>31781</miles-earned>
  </month>
</report>

Hier das Stylesheet: Es wird dieselbe Transformation zweimal ausgeführt, einmal mit der Funktion current() und einmal ohne sie.

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:months="Lookup table for month names">

  <months:name sequence="12">December</months:name>
  <months:name sequence="01">January</months:name>
  <months:name sequence="02">February</months:name>
  <months:name sequence="03">March</months:name>
  <months:name sequence="04">April</months:name>
  <months:name sequence="05">May</months:name>
  <months:name sequence="06">June</months:name>
  <months:name sequence="07">July</months:name>
  <months:name sequence="08">August</months:name>
  <months:name sequence="09">September</months:name>
  <months:name sequence="10">October</months:name>
  <months:name sequence="11">November</months:name>

  <xsl:output method="text"/>


  <xsl:variable name="newline">
<xsl:text>
</xsl:text>
  </xsl:variable>

  <xsl:template match="/">
    <xsl:value-of select="$newline"/>
    <xsl:text>A test of the current() function:</xsl:text>

    <xsl:value-of select="$newline"/>
    <xsl:value-of select="$newline"/>
    <xsl:for-each select="/report/month">
      <xsl:text>   </xsl:text>
      <xsl:value-of 
        select="document('')/*/months:name[@sequence=current()/@sequence]"/>
      <xsl:text> - </xsl:text>
      <xsl:value-of select="format-number(miles-flown, '##,###')"/>
      <xsl:text> miles flown, </xsl:text>
      <xsl:value-of select="format-number(miles-earned, '##,###')"/>
      <xsl:text> miles earned.</xsl:text>
      <xsl:value-of select="$newline"/>
      <xsl:text>      (Averaged </xsl:text>
      <xsl:value-of 
        select="format-number(miles-earned div miles-flown, '##.#')"/>
      <xsl:text> miles earned for each mile flown.)</xsl:text>
      <xsl:value-of select="$newline"/>
      <xsl:value-of select="$newline"/>
    </xsl:for-each>
    <xsl:value-of select="$newline"/>

    <xsl:text>Let's try it again, without using current() this time:</xsl:text>
    <xsl:value-of select="$newline"/>
    <xsl:value-of select="$newline"/>

    <xsl:for-each select="/report/month">
      <xsl:text>   </xsl:text>
      <xsl:value-of 
        select="document('')/*/months:name[@sequence=./@sequence]"/>
      <xsl:text> - </xsl:text>
      <xsl:value-of select="format-number(miles-flown, '##,###')"/>
      <xsl:text> miles flown, </xsl:text>
      <xsl:value-of select="format-number(miles-earned, '##,###')"/>
      <xsl:text> miles earned.</xsl:text>
      <xsl:value-of select="$newline"/>
      <xsl:text>      (Averaged </xsl:text>
      <xsl:value-of 
        select="format-number(miles-earned div miles-flown, '##.#')"/>
      <xsl:text> miles earned for each mile flown.)</xsl:text>

      <xsl:value-of select="$newline"/>
      <xsl:value-of select="$newline"/>
    </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>

Hier die Ergebnisse:


A test of the current() function:

   January - 12,379 miles flown, 35,215 miles earned.
      (Averaged 2.8 miles earned for each mile flown.)

   February - 32,857 miles flown, 92,731 miles earned.
      (Averaged 2.8 miles earned for each mile flown.)

   March - 19,920 miles flown, 76,725 miles earned.
      (Averaged 3.9 miles earned for each mile flown.)

   April - 18,903 miles flown, 31,781 miles earned.
      (Averaged 1.7 miles earned for each mile flown.)


Let's try it again, without using current() this time:

   December - 12,379 miles flown, 35,215 miles earned.
      (Averaged 2.8 miles earned for each mile flown.)

   December - 32,857 miles flown, 92,731 miles earned.
      (Averaged 2.8 miles earned for each mile flown.)

   December - 19,920 miles flown, 76,725 miles earned.
      (Averaged 3.9 miles earned for each mile flown.)

   December - 18,903 miles flown, 31,781 miles earned.
      (Averaged 1.7 miles earned for each mile flown.)

Beim zweiten Durchgang hat das Stylesheet jedes <month>-Element dem Monat December zugeordnet. Der Unterschied ist, dass die Punktsyntax (.) den aktuellen Knoten an diesem Punkt im XPath-Ausdruck repräsentiert, während die Funktion current() den Knoten repräsentiert, der vor der Auswertung des XPath-Ausdrucks durch den XSLT-Prozessor der aktuelle war.

Anders ausgedrückt: der XSLT-Prozessor beginnt mit dem ersten <months:name>-Element und sucht nach dem Element, dessen sequence-Attribut einem anderen untersuchten sequence-Attribut entspricht. Wenn das andere sequence-Attribut mit ./@sequence angegeben wird, bezeichnet das sequence-Attribut des an diesem Punkt im Ausdruck aktuellen Knotens, welches das erste <months:name>-Element ist. Dadurch wird immer der Wert des ersten <months:name>-Elements zurückgegeben. Dagegen wird bei Verwendung der Funktion current() der Knoten zurückgegeben, der zu Beginn der Ausdrucksauswertung der aktuelle war. Die Funktion current() erzielt also das gewünschte Verhalten.