Bonjour à tous. J'ai un sacré défit pour mon premier projet xslt. Je débute et je ne connais pas encore toutes les roublardises du langage. Je vous soumet donc ce que j'ai fait.

Mon xml:


<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet href="carte.xsl" type="text/xsl"?>
<xml>
<cases><X>0</X><Y>5</Y></cases>
<cases><X>1</X><Y>5</Y></cases>
<cases><X>2</X><Y>5</Y></cases>
<cases><X>3</X><Y>5</Y></cases>
....
<cases><X>0</X><Y>6</Y></cases>
<cases><X>1</X><Y>6</Y></cases>
<cases><X>2</X><Y>6</Y></cases>
<cases><X>3</X><Y>6</Y></cases>
....
</xml>


Bien sur le xml est extensible. Si l'on prend une carte de 200*200 de dimension, ça fait 40.000 cases....!!!!

Le but est de générer une carte de 10*10 cases quoi qu'il arrive. Cette carte est centrer de façon dynamique sur des coordonnées.

Voila donc comment je gere ca via mon xls:

Le template qui parse le xml:

<xsl:template match="xml">
<html><body>
	<p>Liste de nombres :</p>
	<table cellpadding="0" cellspacing="0" border="1">
		<xsl:call-template name="boucley" />
	</table>
</body></html>
</xsl:template>


Il lance la boucle des lignes Y. voici son code:

<xsl:template name="boucley">
	<xsl:param name="debuty" select="0" />
	<xsl:param name="finy" select="10" />

	<xsl:if test="$debuty &lt; $finy">
		<tr>
		<xsl:call-template name="bouclex">
			<xsl:with-param name="debuty" select="($debuty)" />
		</xsl:call-template>
		</tr>
		<xsl:call-template name="boucley">
			<xsl:with-param name="debuty" select="($debuty)+1" />
		</xsl:call-template>
	</xsl:if>
</xsl:template>


Chaque passage de boucle lance la création des colonnes.


<xsl:template name="bouclex">
	<xsl:param name="debutx" select="0" />
	<xsl:param name="debuty" select="0" />
	<xsl:param name="finx" select="10" />

	<xsl:if test="$debutx &lt; $finx">
		<td>
			<xsl:for-each select="/xml/cases[X=$debutx and Y=$debuty]">
				OK
			</xsl:for-each>
		</td>
		<xsl:call-template name="bouclex">
			<xsl:with-param name="debutx" select="($debutx)+1" />
		</xsl:call-template>
	</xsl:if>
</xsl:template>


Ce coup ci on créer les td pour chaque ligne et colonne. Le truc c que je fait un for each pour vérifier sir la case que l'on teste existe dans le xml. Par la suite si cette case est trouvée, on affichera des informations venant du xml.

Le truc c'est que si je génère un xml de 200*200 cases, cela devient extrêmement long.

Donc voila j'attends vos avis, si j'ai fait des erreurs ou qu'il y a moyen de faire mieux je suis preneur.

merci bien, Wells
Bonjour,

Ton projet semble alléchant, mais à la lecture attentive de tes fragments de code, je n'ai pas réussi à me faire une idée précise de tes objectifs.
- ton xml de départ désigne des cases mais ces cases ne semblent pas avoir de contenus. est ce seulement la présence ou l'absence d'une case dans la grille qui importe ?
- que souhaites tu réellement afficher en sortie de la transformation xslt. Pourrais tu fournir le xml résultat correspondant au xml source que tu as donné ?
Et bien les cases sont vides pour l'instant. Après le concept reste le même. Pour l'instant on teste juste leur existante.

Le résultat attendu est un tableau de 10*10 cases. Disons colorié en bleu si elles sont vides et en rouge si elles sont dans le xml;

Je sais pas trop comment l'expliquer autrement ^^
Dans ce cas, tu peux effectivement balayer toutes les cases à afficher par les 2 templates imbriqués bouclex et boucley que tu as définis.

Les tests que tu utilises ainsi que le for each ne sont pas utiles. Il vaut mieux te servir de <xsl:key /> pour connaitre la présence ou non de la case dans ton xml source.