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