**Je n'ai fait attention qu'après qu'il y avait le forum XSLT, si un modérateur juge que ce sujet à plutôt sa place là-bas, il peut le déplacer. Désolé**

Bonjour à tous !

Je viens vers vous après un problème qui m'a occupé pratiquement tout mon weekend... Je veux faire l'index d'une FAQ.

Voici mon fichier xml :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 
<faq>
	<entry>
		<rubrique>RubriqueA</rubrique>
		<titre>Problème1</titre>
		<contenu>Ceci est le contenu</contenu>
	</entry>
	<entry>
		<rubrique>RubriqueA</rubrique>
		<titre>Problème2</titre>
		<contenu>Ceci est le contenu</contenu>
	</entry>
	<entry>
		<rubrique sous_rubrique="Partie1" >RubriqueA</rubrique>
		<titre>Problème3</titre>
		<contenu>Ceci est le contenu</contenu>
	</entry>
	<entry>
		<rubrique>RubriqueB</rubrique>
		<titre>Problème4</titre>
		<contenu>Ceci est le contenu</contenu>
	</entry>
	<entry>
		<rubrique sous_rubrique="Partie1" >RubriqueB</rubrique>
		<titre>Problème5</titre>
		<contenu>Ceci est le contenu</contenu>
	</entry>
</faq>
J'aimerais obtenir ceci (note: les "entry" sans sous-rubriques vont dans DIVERS):

RubriqueA
Divers
Problème1
Problème2
Partie1
Problème3

RubriqueB
Divers
Problème4
Partie1
Problème5

J'y arrive pas trop mal, sauf que mon XSLT à un problème dans un cas particulier...
Quand j'ai deux "Entry" de "Rubrique" différentes, mais qui possèdent le même nom de "sous_rubrique" (comme c'est illustré dans l'exemple) j'obtiens ca :

RubriqueA
Divers
Problème1
Problème2
Partie1
Problème3

RubriqueB
Divers
Problème4
Les éléments les sous-rubriques du même nom (ici "Partie1" associée au problème5 et au problème3) ne sont calculés qu'une fois. Une fois qu'elle a été trouvée dans la première rubrique, la sous rubrique ne s'affichera pas dans la rubrique suivante...


J'utilise des Muenchians pour dédoublonner les rubriques.
Voici mon xslt :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
...
<xsl:key name="RUBRIQUE" match="entry" use="rubrique"/>
<xsl:key name="SOUSRUBRIQUE" match="entry" use="rubrique/@sous_rubrique"/>
 
			<!--Table des matières-->
			<div id="TOC">
			<div class="titreTOC">INDEX</div>
				<ul>
					<xsl:for-each select="//entry[generate-id() = generate-id(key('RUBRIQUE', ./rubrique)[1])]">
					<xsl:sort select="rubrique"/>
						<li><xsl:value-of select="./rubrique/text()"/></li>
						<ul>
							<li><ul>
								<xsl:for-each select="//entry[rubrique=current()/rubrique/text()]">
									<xsl:if test="not(current()/rubrique/@sous_rubrique)">
										<xsl:apply-templates select="titre" mode="TOC"/>
									</xsl:if>
								</xsl:for-each>
							</ul></li>
							<xsl:for-each select="//entry[rubrique=current()/rubrique]">
							<xsl:sort select="rubrique/@sous_rubrique"/>
									<xsl:for-each select="current()[generate-id() = generate-id(key('SOUSRUBRIQUE', ./rubrique/@sous_rubrique)[1])]">
										<li><xsl:value-of select="./rubrique/@sous_rubrique"/></li>
										<ul>
											<xsl:for-each select="//entry[rubrique=current()/rubrique/text() and rubrique/@sous_rubrique=current()/rubrique/@sous_rubrique]">
											<xsl:sort select="titre"/>
												<xsl:apply-templates select="titre" mode="TOC"/>
											</xsl:for-each>
										</ul>
									</xsl:for-each>
							</xsl:for-each>
						</ul>
					</xsl:for-each>
				</ul>
			</div>
			<!--FIN de la table des matières-->
...
Je suis sous XMLSpy, j'ai tenté le debug mode et je ne comprends pas pourquoi il ne va pas chercher mes sous-rubrique au second passage... pourtant ils sont présents dans la liste de noeuds quand il doit les traiter.

Je débute encore et toujours. Ne vous étonnez pas si vous pensez que ma méthode pour générer cet index est "Dinosaure"
Sur cette FAQ, je n'ai pas de contrainte (c'est moi qui crée tout) donc je suis ouvert à d'autre propositions d'architecture ou d'algorithme.

Par contre, je suis sous XSLT 1.0

Merci d'avance !