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 :

Fusion de deux nodes différentes [XSLT 1.0]


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Points : 240
    Points
    240
    Par défaut Fusion de deux nodes différentes
    Bonjour,

    Je souhaiterai fusionner 2 éléments différent, pour faire simple voici un exemple:
    xml d'entrée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	<MesData>
    		<homme name="Dupont" prénom="Alain"/>
    		<homme name="Felix" prénom="Minou"/>
    		<homme name="Pi" prénom="Joe"/>
    	</MesData>
     
    	<Anciennete>
    		<Information id="Dupont" age="27"/>
    		<Information id="Felix" age="4"/>
    	</Anciennete>
    Et je souhaiterai obtenir ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	<Fusion>
    		<homme name="Dupont" prénom="Alain" age="27"/>
    		<homme name="Felix" prénom="Minou" age="4"/>
    		<homme name="Pi" prénom="Joe"/>
    	</Fusion>
    Cet exemple illustre mon besoin, techniquement le fichier est plus complexe, vous vous en doutez .

    Donc, les éléments MesData et Anciennete sont dans 2 XPath différent, ils ne sont pas au même niveau. Le fichier d'entrée est non-modifiable, fourni par un tiers.
    Les attributs @name et @id font office de clés.

    Donc déjà, est-ce que c'est possible et réaliste avec xslt? (est-ce le bon outil?)
    Et sinon pour ma part, j'étudie 3 options:
    - passer par des variables (je galère et pour le moment chou blanc mais aujourd'hui je continue sur cette option),
    - trouver un moyen natif (pas encore trouvé),
    - passé par un xml intermediaire: mettre les infos au même niveau et essayer de simplifier la fusion.

    Je suis novice sur le xslt, pourriez-vous m'orienter sur la solution la plus convenable? Et j'ai peut-être rater d'autre option.

    Merci à vous

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par kacedda Voir le message
    Donc déjà, est-ce que c'est possible et réaliste avec xslt?
    Tout à fait, et là c'est encore assez simple.

    Citation Envoyé par kacedda Voir le message
    (est-ce le bon outil?)
    Ça dépend du contexte. Il n'est ni spécialement bon ni spécialement mauvais pour faire ça.
    - Si ça a un sens de faire du XSLT dans tes outils, c'est ok.
    - Si tu avais pas de XSLT avant d'avoir besoin de faire ça, ça se discute. Un langage de programmation le ferait tout aussi bien, sans perdre de temps en apprentissage/intégration.

    Citation Envoyé par kacedda Voir le message
    Je suis novice sur le xslt, pourriez-vous m'orienter sur la solution la plus convenable? Et j'ai peut-être rater d'autre option.
    Tu as effectivement besoin d'une variable, mais à part ça je suggère "ne pas se prendre la tête" et "juste faire ce qui a besoin d'être fait."

    Quand tu trouves un type qui s'appelle Dupont il faut lui ajouter son âge qui est situé ailleurs ? Ben voilà, pas besoin de faire autre chose que ça.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <xsl:template match="/">
      <fusion>
        <xsl:for-each select="//mes-data/homme">
          <xsl:variable name="nom" select="@name"/>
          <homme>
            <!-- copier les attributs de l'élément en cours -->
            <xsl:copy-of select="@*"/>
            <!-- aller chercher l'âge -->
            <xsl:copy-of select="//anciennete/information[@id = $nom]/@age"/>
          </homme>
        </xsl:for-each>
      </fusion>
    </xsl:template>
    Après on peut finasser si besoin en utilisant <xsl:copy> et <xsl:apply-templates> mais sur l'exemple montré ce n'est pas utile.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Points : 240
    Points
    240
    Par défaut
    P...inaise!!! C'est tellement simple !!!

    Pour situer, on est en début de projet et j'aurai pu le faire en C# ou autre, voir en C!
    Mais pour le moment on s'occupe surtout de l'extraction de donnée et perso, ça me permet d'apprendre le xslt... et c'est assez marrant comme langage! Ca change du compilé, et vu que ça fait le boulot (et plutôt bien)...!

    Merci bcp pour ton aide
    I'll be back!

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 11/07/2005, 15h20
  2. Fusion de deux états
    Par nancy54 dans le forum QuickReport
    Réponses: 2
    Dernier message: 07/06/2005, 19h07
  3. [ADO.Net][VB.NET] Comment copier des données entre deux BDD différentes ?
    Par maddog2032 dans le forum Accès aux données
    Réponses: 6
    Dernier message: 06/06/2005, 11h01
  4. enregistrer deux variable différente dans un seul champs
    Par developpeur_mehdi dans le forum Bases de données
    Réponses: 7
    Dernier message: 07/03/2004, 23h18
  5. [date] Comparer deux formats différents
    Par terziann dans le forum Requêtes
    Réponses: 17
    Dernier message: 21/07/2003, 15h21

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