Quelle est la meilleure façon de boucler en XSLT de 1 à 60 ? Je recherche sur le net, il existe des modèles pour le faire, existe-t-il un autre moyen, par exemple, comme une fonction intégrée ?
Réponses
Trop de publicités?Dans XSLT 2.0,
<xsl:for-each select="1 to 60">...</xsl:for-each>
Mais je suppose que vous devez utiliser XSLT 1.0, sinon vous ne poseriez pas la question.
Dans XSLT 1.0, vous devez utiliser la récursivité : un modèle qui s'appelle lui-même avec un compteur qui est incrémenté à chaque appel, et la récursivité se termine lorsque la valeur requise est atteinte.
Alternativement, il existe une solution de contournement dans XSLT 1.0 : à condition que votre document source contienne au moins 60 nœuds, vous pouvez faire
<xsl:for-each select="(//node())[60 >= position()]">...</xsl:for-each>
Vérification très simple à l'intérieur de la boucle foreach
<xsl:if test="$maxItems > position()">
do something
</xsl:if>
D' après la réponse de Dimitre Novatchev.
Exemple:
<xsl:variable name="maxItems" select="10" />
<xsl:variable name="sequence" select="any-sequence"/>
<xsl:for-each select="$sequence">
<!-- Maybe sort first -->
<xsl:sort select="@sort-by" order="descending" />
<!-- where the magic happens -->
<xsl:if test="$maxItems > position()">
do something
</xsl:if>
</xsl:for-each>
L'exemple de base pour la V1.0 utilisant la récursivité serait-il comme ceci :
<xsl:template match="/">
<Root>
<!-- Main Call to MyTemplate -->
<xsl:call-template name="MyTemplate" />
</Root>
</xsl:template>
<xsl:template name="MyTemplate">
<xsl:param name="index" select="1" />
<xsl:param name="maxValue" select="60" />
<MyCodeHere>
<xsl:value-of select="$index"/>
</MyCodeHere>
<!-- < represents "<" for html entities -->
<xsl:if test="$index < $maxValue">
<xsl:call-template name="MyTemplate">
<xsl:with-param name="index" select="$index + 1" />
<xsl:with-param name="total" select="$maxValue" />
</xsl:call-template>
</xsl:if>
</xsl:template>
XSLT fonctionne sur la base de modèles et vous aurez besoin d'un modèle pour exécuter cette boucle.
Vous devrez créer un modèle recevant les valeurs de début et de fin et, à l'intérieur, effectuer un appel récursif avec start + 1. Lorsque $start est égal à $end, vous renvoyez votre modèle, sans autre appel.
En pratique : http://www.ibm.com/developerworks/xml/library/x-tiploop/index.html