Hello,

Je suis extremement détutant en XSL Smiley cligne .
Je dois transormer un xml en une liste html(facile, même pour moi), mais dont les element ont une classe alternante (une fois class1, une fois class2).

Mon code pour l'instant :


<?xml version="1.0" encoding="ISO-8859-1" ?>
<xsl:stylesheet  version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="ISO-8859-1" indent="yes"/>

		<xsl:template match="/">
				<ul>
					<xsl:apply-templates/>
				</ul>					
		</xsl:template>

		<xsl:template match="news" >
				<li>
					<a href="{url}"><xsl:value-of select="title"/></a>
				</li>
		</xsl:template >

</xsl:stylesheet>


et, j'aimerais avoir une liste du style :


<li>
  <a href="blahblah" class="class1">blabla</a>
</li>
<li>
  <a href="blahblah" class="class2">blabla</a>
</li>
<li>
  <a href="blahblah" class="class1">blabla</a>
</li>
<li>
  <a href="blahblah" class="class2">blabla</a>
</li>


Et je n'ai aucune idée de comment faire Smiley smile Smiley smile

Mârci Smiley smile
Modifié par brankgnol (06 May 2005 - 16:16)
Il y a beaucoup de solutions, et le choix dépend aussi de ton fichier XML source.

Voici un principe qui pourrait fonctionner (à voir avec ton XML source) :

1/ utilise la structure de test basée sur xsl:choose xsl:when et xsl:otherwise
2/ teste si la position de l'élément courant est paire
3/ xsl:when pour class1 et xsl:otherwise pour class2

Le test se réalise simplement avec l'opérateur mod (position() mod 2 = 0).
Merci, Smiley smile

J'ai donc modifié mon code comme suit :
		<xsl:template match="news" >
		  		<xsl:choose>
		  			<xsl:when test="((position() mod 2) != 0)">
						<li>
							<a class="news1" href="{url}"><xsl:value-of select="title"/></a>
						</li>
					</xsl:when>
					<xsl:otherwise>
						<li>
							<a class="news2" href="{url}"><xsl:value-of select="title"/></a>
						</li>
					</xsl:otherwise>
				</xsl:choose>
		</xsl:template>


Mais je retombe toujours sur la même classe.(tous en class1 ou tous en class2).

Je pense que c'est du à mon xml, il doit tester un autre element que le 'news', mais si je sors le xsl:choose devant le xsl template, j'ai une erreur.

Je vous colle mon xml :

<?xml version="1.0" encoding="ISO-8859-1"?>
<liste>
		<news>
			<title>blablabla</title>
			<url>/blabla.php</url>
		</news>
		<news>
			<title>blablabla</title>
			<url>/blabla.php</url>
		</news>
		<news>
			<title>blablabla</title>
			<url>/blabla.php</url>
		</news>
		<news>
			<title>blablabla</title>
			<url>/blabla.php</url>
		</news>
		<news>
			<title>blablabla</title>
			<url>/blabla.php</url>
		</news>
</liste>


:) ouala, on s'approche... Smiley smile
Tu y étais presque. En fait dans ton code position() donne le rang d'un noeud dans une liste de noeuds qui comprend les noeuds news mais aussi des noeuds textes vides (ou plutôt contenant des blancs). Tu aurais eu le bon résultat si les noeuds news avaient été tous sur la même ligne dans ton XML.
Cependant il vaut mieux changer un peu le XSL et utiliser xsl:for-each. Voici ce que ça donne (j'en ai profité pour modifier l'imbrication du xsl:choose) :
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
 <xsl:template match="/" >
 <xsl:for-each select = "//news">
 <li>
 <a href="{url}">
 <xsl:attribute name="class">
 <xsl:choose>
<xsl:when test="(position() mod 2) != 0">
 <xsl:text>news1</xsl:text></xsl:when>
<xsl:otherwise><xsl:text>news2</xsl:text></xsl:otherwise>
</xsl:choose>
 </xsl:attribute>
<xsl:value-of select="title"/>
</a>
</li>
 </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>
Un grand merci!
Ca marche impeccablement bien.
Il me reste plus qu'à regarder ca de près pour bien le comprendre... Smiley smile

Merci!