Bonjour,

Je tente de faire une boucle en xslt.

Le code suivant fonctionne:

				<xsl:call-template name="ajoutVignettes">
					<xsl:with-param name="start">1</xsl:with-param>
					<xsl:with-param name="end">9</xsl:with-param>
				</xsl:call-template>



	<xsl:template name="ajoutVignettes">
		<xsl:param name="start"/>
		<xsl:param name="end"/>
		
		<h3><img src="img/vigBlank" alt="" />start:<xsl:value-of select="$start"/>/stop:<xsl:value-of select="$end"/></h3>
		
	
		<xsl:if test="$start &lt; $end">
			<xsl:call-template name="ajoutVignettes">
				<xsl:with-param name="start"><xsl:value-of select="$start + 1"/></xsl:with-param>
				<xsl:with-param name="end"><xsl:value-of select="$end"/></xsl:with-param>
			</xsl:call-template>
		</xsl:if>
	</xsl:template>


Le problème survient lorsque j'essaie de remplacer le paramètre end (ici la valeur 9) par le contenu d'une variable.
				<xsl:call-template name="ajoutVignettes">
					<xsl:with-param name="start">1</xsl:with-param>
					<xsl:with-param name="end"><xsl:number value="$nombreVignettesVides" /></xsl:with-param>
				</xsl:call-template>

Y'a t'il un moyen de faire cela?
Modifié par nbweb (19 Feb 2009 - 14:13)
Bonjour,

Comme dans tout langage, une variable a ce qu'on appelle une portée, c'est-à-dire la partie du code où elle peut être utilisée car "comprise" par l'interpréteur.

En XSLT, une variable a comme portée l'ensemble des descendants de son nœud parent. Par conséquent, écrire...

<xsl:call-template name="ajoutVignettes">
	<xsl:with-param name="start">1</xsl:with-param>
	<xsl:with-param name="end"><xsl:number value="$nombreVignettesVides" /></xsl:with-param>
</xsl:call-template>

... n'a de sens que si, soit dans le template où tu l'utilises (le template ajoutVignettes), soit dans son élément parent (à savoir l'élément xsl:stylesheet lui-même), la variable a été définie. Si elle a été définie dans un autre template, tu ne peux pas l'utiliser ici.
Modifié par Gilles (19 Feb 2009 - 09:43)
En fait j'ai identifié le problème. Ça n'est pas un problème de portée de variable, mais simplement de type de variable. Il considère dans mon cas que 2 est plus grand que 13. Comment puis-je créer une variable de type numérique?

Rappel, pour créer ma variable, j'utilisais le code suivant:

<xsl:variable name="nombreVignettesVides">
	<xsl:choose>
		<xsl:when test="count(image)&lt;20">
			<xsl:value-of select="20 - (count(image))"/>
		</xsl:when>
		<xsl:otherwise>
			<xsl:value-of select="5 - (count(image) mod 5)"/>
		</xsl:otherwise>
	</xsl:choose>
</xsl:variable>

Merci de votre aide.
Et pour appeler ma variable, j'utilise ce code-ci:
<xsl:value-of select="$nombreVignettesVides"/>

Modifié par nbweb (19 Feb 2009 - 13:45)