Bonjour à tous,
Je me permets de vous contacter pour un souci de XSLT qui me turlupine.
Je dispose d'un XML source structuré comme suit :
Par une transformation XSL, je souhaiterais récupérer chacune des valeurs pour les insérer dans un élément <unité> :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 <article> <éléments_concaténés>valeur1,valeur2,valeur3,valeur2,valeur6,valeur9...</éléments_concaténés> </article>
J'ai déjà la tentative suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 <OUTPUT> <unité>valeur1</unité> <unité>valeur2</unité> <unité>valeur3</unité> <unité>valeur6</unité> <unité>valeur9</unité> <unité>...</unité> </OUTPUT>
Cependant, j'obtiens un message de mon éditeur XML qui m'alerte que le traitement est trop lourd ; pourtant, le contenu de <éléments_concaténés> ne comporte qu'environ 500 valeurs. J'obtiens bien un XML en output mais il est tronqué avant la fin.
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
38
39 <xsl:param name="virgule"><xsl:text>,</xsl:text></xsl:param> <xsl:template match="éléments_concaténés"> <xsl:element name="OUTPUT"> <xsl:call-template name="traitement_valeurs"> <xsl:with-param name="fichier_source" select="."/> </xsl:call-template> </xsl:element> </xsl:template> <xsl:template name="traitement_valeurs"> <xsl:param name="fichier_source"/> <xsl:choose> <xsl:when test="contains($fichier_source, $virgule)"> <xsl:if test="substring-before($fichier_source, $virgule)"> <xsl:call-template name="un_par_un"> <xsl:with-param name="valeur_unique" select="substring-before($fichier_source, $virgule)"/> </xsl:call-template> </xsl:if> <xsl:if test="substring-after($fichier_source, $virgule)"> <xsl:call-template name="traitement_valeurs"> <xsl:with-param name="fichier_source" select="substring-after($fichier_source, $virgule)"/> </xsl:call-template> </xsl:if> </xsl:when> <xsl:otherwise> <xsl:call-template name="un_par_un"> <xsl:with-param name="valeur_unique" select="$fichier_source"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template name="un_par_un"> <xsl:param name="valeur_unique"/> <xsl:element name="unité"> <xsl:value-of select="$valeur_unique"/> </xsl:element> </xsl:template>
De plus, je souhaiterais que les unités de l'OUPUT soient triés par ordre alphabétique, et que les doublons soient supprimés... Mais mon XSL ne comporte aucun <xsl:for-each> ni <xsl:apply-templates>, je ne peux donc pas insérer de <xsl:sort> pour le tri.
Je vous remercie par avance beaucoup pour les indications que vous pourrez m'apporter
Jonas.
Partager