IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XSL/XSLT/XPATH XML Discussion :

transformer en références les doublons d'une balise [XSLT 2.0]


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre habitué
    Homme Profil pro
    Architecte senior Java EE/Spring - ScrumMaster
    Inscrit en
    Juin 2010
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Architecte senior Java EE/Spring - ScrumMaster
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2010
    Messages : 229
    Points : 162
    Points
    162
    Par défaut transformer en références les doublons d'une balise
    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 :
    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>
    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...

    Je serai content d'avoir (encore) vos conseils sur ce coup-là. Merci d'avance et bonne journée.

  2. #2
    Membre habitué
    Homme Profil pro
    Architecte senior Java EE/Spring - ScrumMaster
    Inscrit en
    Juin 2010
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Architecte senior Java EE/Spring - ScrumMaster
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2010
    Messages : 229
    Points : 162
    Points
    162
    Par défaut
    J'avoue que je suis assez content de moi, sur ce coup...
    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
     
    <xsl:template match="e">
    	<xsl:variable name="ref" select="(//e[@value=''])[1]" />
     
    	<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:apply-templates select="$ref" mode="ref" /></xsl:attribute>
    			</xsl:when>
    			<xsl:otherwise>
    				<xsl:copy-of select="@value" />
    			</xsl:otherwise>
    		</xsl:choose>
    	</xsl:copy>
    </xsl:template>
     
    <xsl:template match="e" mode="ref">
    	<xsl:variable name="pos"><xsl:number level="any" count="*[local-name()!='val' and not(@ref)]" /></xsl:variable>
    	<xsl:value-of select="$pos - 1" />
    </xsl:template>

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    Nous noterons au passage que tu utilises generate-id() pour beaucoup de choses, mais pas pour générer un id .

  4. #4
    Membre habitué
    Homme Profil pro
    Architecte senior Java EE/Spring - ScrumMaster
    Inscrit en
    Juin 2010
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Architecte senior Java EE/Spring - ScrumMaster
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2010
    Messages : 229
    Points : 162
    Points
    162
    Par défaut c't'en plein ça !
    On a bien des attributs "uuid", mais ils ne posent pas vraiment pb...
    Est-ce qu'il y a une façon plus sioux de comparer les éléments, dans mon cas ??

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. supprimer les doublons dans une table
    Par mavean dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 26/06/2019, 13h26
  2. Comment supprimer les doublons d'une table?!
    Par JauB dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/01/2006, 08h48
  3. [vbexcel]Comment supprimer les doublons dans une combobox?
    Par Mugette dans le forum Macros et VBA Excel
    Réponses: 20
    Dernier message: 24/11/2005, 11h12
  4. Comment compter les doublons d'une colonne?
    Par Dnx dans le forum Langage SQL
    Réponses: 8
    Dernier message: 07/11/2005, 10h50
  5. Éviter les doublons dans une requete
    Par royrremi dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 03/08/2004, 19h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo