Bonjour à tous,
Je viens vers vous aujourd'hui avec un pb qui me semble un peu plus complexe que mes cagouilles habituelles (merci encore aux patients experts qui m'ont remis sur le droit chemin en xpath).
Je souhaite remplacer les balises <e value=""/> répétées dans un arbres lorsqu'elles sont redondantes. Pour cela, je les remplace par des tags <e ref="x"/> ; le pb étant qu'à cette étape de mon traitement et comme on le voit ci-dessus, les balises n'ont pas d'id !
Mais POURQUOI diantre n'ai-je pas d'ids sur mes balises ? Au final, je suis contraint à ce que toutes les balises (sauf les références et les balises <val> qui font exception) aient des id continus ; aucune rupture n'est tolérée (désérialisation Javolution pré-existante). Bref ; si j'affecte les ids avant de référencer mes doublons, cela va provoquer des ruptures dans la continuité.
Tant que possible, je souhaite éviter de générer les ids plusieurs fois (fichiers XML >15Mo).
DONC, il me faut détecter la première balise <e value=""/> dans l'arbre, calculer sa position a priori et m'en servir pour passer en référence les suivantes avant de continuer.
Voici la bête :
La variable $ref récupère la première balise visée (à conserver, donc) et la variable $pos calcule l'id localement ; mais je ne sais pas comment calculer l'id pour $ref "à distance". Peut-être par une fonction count($ref, "...") permettant de lier mes deux critères. Je ne sais pas faire les fonctions...
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 <xsl:template match="/"> <xsl:apply-templates /> </xsl:template> <xsl:template match="node()[local-name()!='e']"> <xsl:copy> <xsl:copy-of select="@*" /> <xsl:apply-templates select="*" /> </xsl:copy> </xsl:template> <xsl:template match="e"> <!-- FIXME l'id n'est pas encore créé ! --> <xsl:variable name="ref" select="(//e[@value=''])[1]" /> <xsl:variable name="pos"><xsl:number level="any" count="*[local-name()!='val' and not(@ref)]" /></xsl:variable> <xsl:copy> <xsl:choose> <xsl:when test="@value='' and generate-id(.)!=generate-id($ref)"> <!-- remplacer l'attribut "value" vide par une référence --> <xsl:attribute name="ref"><xsl:value-of select="$ref" /></xsl:attribute> </xsl:when> <xsl:otherwise> <xsl:copy-of select="@value" /> </xsl:otherwise> </xsl:choose> </xsl:copy> </xsl:template>
Je serai content d'avoir (encore) vos conseils sur ce coup-là. Merci d'avance et bonne journée.
Partager