Bonjour,

Je vais simplifier mon problème afin que vous puissiez m'aider.

Je fais une requête de recherche sur des fichiers XML. Les résultats sont stockés dans un seul "fichier virtuel", j'y accède par :

<xsl:for-each select="/sdx:document/sdx:results/sdx:result">

La structure est donc la suivante :

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
 
<sdx:document>
  <sdx:results>
 
    <sdx:result>
      <adfi:article/> <!--On imaginera ici que @role = breves -->
    </sdx:result>
 
    <sdx:result>
      <adfi:article/>
    </sdx:result>
 
    <sdx:result>
      <adfi:figure/>
    </sdx:result>
 
    <sdx:result>
      <adfi:article/>
    </sdx:result>
 
    <sdx:result>
      <adfi:resource/>
    </sdx:result>
 
    <sdx:result>
      <adfi:resource/>
    </sdx:result>
 
  </sdx:results>
</sdx:document>
Jusque là, tout va bien.

J'ai pris un cas où mon sdx:result contient 6 données (et il peut y avoir des doublons)

Je voudrai pouvoir mémoriser cette donnée en supprimant les doublons.

De plus, pour compliquer le tout, je voudrai afficher :
"Notice" si on a "<adfi:article/>" ,
"Brèves" si on a "<adfi:article/>" où @role = breves ,
"Illustrations" si on a "<adfi:figure/>" ,
"Référence bibliographique" si on a "<adfi:resource/>".

Et donc obtenir en sortie le code suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
Brèves ; Notices ; Illustrations ; Référence bibliographique.
Voici le code que j'utilise actuellement pour cela :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
<xsl:for-each select="/sdx:document/sdx:results/sdx:result">				
	<xsl:choose>
		<xsl:when test="./adfi:article[@role='breves']">brèves</xsl:when>
		<xsl:when test="./adfi:figure">illustrations</xsl:when>
		<xsl:when test="./adfi:resource">références bibliographiques</xsl:when>
		<xsl:otherwise>notices</xsl:otherwise>
  	</xsl:choose>
 
	<xsl:choose>
		<xsl:when test="position() != last()"> ; </xsl:when>
		<xsl:otherwise>.</xsl:otherwise>
	</xsl:choose>
</xsl:for-each select>
Et j'obtiens :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
brèves ; notices ; illustrations ; notices ; références bibliographiques ; références bibliographiques.
Bref, j'ai des doublons.

En effectuant des recherches sur le site, il semblerait que la méthode Muench permette de supprimer les doublons, mais je crois que je n'ai pas entièrement compris son fonctionnement, malgré la FAQ

J'ai essayé ceci :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
<!--Je suis au début de mon fichier XSL-->
 
<xsl:key name="typeDoc" match="sdx:result" use="."/> 
 
<xsl:template match="/">
	<xsl:apply-templates/>
</xsl:template>
 
<!--Je vais dans plusieurs templates avant d'arriver à la partie intéressante-->
 
<xsl:for-each select="//typeDoc[generate-id(.)=generate-id(key('sdx:result', .)[1])]"> 
	<xsl:value-of select='.'/> 
</xsl:for-each>
Mais cela ne m'affiche rien, même pas les balises <adfi:article> ou autre.

Je me suis un peu perdue dans les tréfonds de XSL, si quelqu'un veut bien me venir en aide ou me mettre sur la voie...