Bonjour, je m'excuse mais je débute en xslt. Ma question est sans doute basique et je ne suis même pas sûr de pouvoir la formuler correctement (c'est sans doute pourquoi je ne trouve rien avec google)
Voilà, j'ai une liste xml de musique:

par ex:

<?xml version="1.0"  encoding="ISO-8859-1"?>
<?xml-stylesheet href="transformation.xsl" type="text/xsl"?>
<plist>
	<title>Musique</title>
	<totaltracks>341</totaltracks>
	<totaltime>29:30:48</totaltime>
	<totalsize>1.9 GB</totalsize>
	<tracks>
		<track>
			<trackname>New</trackname>
			<id>1067</id>
			<artist>Bruit Des Zig</artist>
			<album>Maquette Avril 2000</album>
			<genre>Jazz</genre>
			<rating>10</rating>
			<size>6.3 MB</size>
			<time>6:48</time>
			<year>2000</year>
		</track>
		<track>
			<trackname>Macchabee</trackname>
			<id>830</id>
			<artist>Busy Bees</artist>
			<album>Demo 4-05-97</album>
			<genre>Rap Hip Hop</genre>
			<rating>0</rating>
			<size>3.9 MB</size>
			<time>4:20</time>
			<year>1997</year>
		</track>
		<track>
			<trackname>Samba da minha terra</trackname>
			<id>798</id>
			<artist>Caminho</artist>
			<album>Caminho</album>
			<genre>Bossa Nova</genre>
			<rating>0</rating>
			<size>3.3 MB</size>
			<time>3:27</time>
			<year>1998</year>
		</track>
		<track>
			<trackname>Solidao</trackname>
			<id>806</id>
			<artist>Caminho</artist>
			<album>Caminho</album>
			<genre>Bossa Nova</genre>
			<rating>40</rating>
			<size>8.6 MB</size>
			<time>9:16</time>
			<year>1998</year>
		</track>
	</tracks>
</plist>


et j'aimerais avoir un template capable de produire la liste des genres sans redondance (et par ordre alphabétique)


  <xsl:template name="genres">
    <xsl:for-each select="plist/tracks/track">
      <xsl:sort select="genre" order="ascending" />
        <xsl:value-of select="genre" />
    </xsl:for-each>
  </xsl:template>


jusqu'ici je suis juste capable d'avoir la liste des genres pour toutes les entrées par ordre alphabetique Smiley confused (j'ai autant de fois "jazz" qu'il y a de titre jazz, par ex)

Merci beaucoup
Smiley smile
Modifié par dj DMSR (18 Sep 2007 - 00:45)
J'ai un peu avancé mais ...

  <xsl:template name="genres">
    <xsl:for-each select="//genre[generate-id(.)=generate-id(key('id', .)[1])]"> 
          <xsl:element name="li">
      		<xsl:value-of select='.'/>
          </xsl:element>
   </xsl:for-each> 
   </xsl:template>

... il me manque l'ordre alphabétique
Smiley confused

        <xsl:sort select="genre" order="ascending" />
ne me donne rien Smiley rolleyes

Note: pour que ça marche ("Méthode Muench") il faut aussi déclarer

<xsl:key name="id" match="genre" use="."/>

avant:

<xsl:template match="/">


Merci de votre patience si vous prenez le temps de m'éclairez

Smiley smile
Modifié par dj DMSR (18 Sep 2007 - 00:09)
la reponse est là

"Méthode Muench"


<xsl:key name="id" match="genre" use="."/>
<xsl:template match="/">
  <ul><xsl:call-template name="genres" /></ul>
</xsl:template>
  
  <xsl:template name="genres">
    <xsl:for-each select="//genre[generate-id(.)=generate-id(key('id', .)[1])]"> 
		<xsl:sort select="." order="ascending"/>
          <xsl:element name="li">
      		<xsl:value-of select='.'/>
          </xsl:element>
   </xsl:for-each> 
   </xsl:template>


On fini par tout trouver sur internet si on sait poser la question. c'est con un autodidacte des fois... Smiley biggol
Modifié par dj DMSR (18 Sep 2007 - 00:38)