43 votes

XSLT : Bouclage de 1 à 60

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 ?

54voto

Michael Kay Points 52194

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>

2voto

Aart den Braber Points 152

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>

1voto

user3199531 Points 1

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>

  <!-- &lt; represents "<" for html entities -->
  <xsl:if test="$index &lt; $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>

0voto

Rubens Farias Points 33357

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X