Fonction current() | |
Renvoie un jeu de nœuds dont le nœud actuel est le seul membre. | |
Entrées | |
Aucune. |
|
Sortie | |
Un jeu de nœuds dont le nœud actuel est le seul membre. La plupart du temps, le nœud actuel est identique au nœud de contexte. Ces deux éléments XSLT ont la même signification : <xsl:value-of select="current()"/> <xsl:value-of select="."/> Dans une expression de prédicat, cependant, le nœud actuel et le nœud de contexte sont généralement différents. L'exemple de la section suivante indique quand utiliser la fonction current(). |
|
Définie dans | |
XSLT section 12.4, Fonctions supplémentaires Divers. |
|
Exemple | |
La fonction current() suivante est utilisée avec une table de recherche. Le document à transformer est le suivant : <?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> La feuille de style est la suivante. Le document a été transformé deux fois, la première fois avec la fonction current() et la seconde sans : <?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> Les résultats sont les suivants : A test of the current() function: January - 12,379 miles flown, 35,215 miles earned. (Averaged 4,51 km earned for each mile flown.) February - 32,857 miles flown, 92,731 miles earned. (Averaged 4,51 km earned for each mile flown.) March - 19,920 miles flown, 76,725 miles earned. (Averaged 6,28 km earned for each mile flown.) April - 18,903 miles flown, 31,781 miles earned. (Averaged 2,74 km 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.) La seconde fois, la feuille de style a fait correspondre tous les éléments <month> au mois December. La différence tient au fait que la syntaxe à point (.) représente le nœud actuel à ce moment précis dans l'expression XPath, alors que la fonction current() représente le nœud actuel avant que le processeur XSLT ne commence l'évaluation de l'expression XPath. En d'autres termes, le processeur XSLT commence par le premier élément <months:name> et essaye de trouver l'élément dont l'attribut sequence correspond à un autre attribut sequence en cours d'évaluation. Si l'on attribue ./@sequence à l'autre attribut sequence, cela désigne l'attribut sequence du nœud actuel à ce moment précis dans l'expression, c'est-à-dire le premier élément <months:name>. Cette opération renvoie toujours la valeur du premier élément <months:name>. L'utilisation de la fonction current(), en revanche, renvoie le nœud qui était actuel au moment du démarrage de l'évaluation de l'expression ; la fonction current() renvoie le comportement souhaité. |