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 :

[XSLT] Restructuration d'un fichier XML


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre régulier Avatar de biggione
    Inscrit en
    Juillet 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 99
    Points : 91
    Points
    91
    Par défaut [XSLT] Restructuration d'un fichier XML
    Bonjour,

    voilà mon probleme, j'ai un fichier XML ayant une arborescence qui m'est inutilisable. Il provient d'une appli que je ne peux pas touché.

    Par contre si je pouvais réorganiser les noeuds cela m'arrangerait, cela est il possible.

    exemple:
    au départ j'ai:
    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
     
    <course>
         <epreuve>
             <numero de l'epreuve>01</numero de l'epreuve>
             <vainqueur>toto</vainqueur>
         </epreuve>
         <epreuve>
             <numero de l'epreuve>02</numero de l'epreuve>
             <vainqueur>fifi</vainqueur>
         </epreuve>
         <epreuve>
             <numero de l'epreuve>03</numero de l'epreuve>
             <vainqueur>toto</vainqueur>
         </epreuve>
    </course>
    et je voudrais obtenir plutot:
    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
     
    <vainqueur>
    <toto>
         <epreuve>
             <numero de l'epreuve>01</numero de l'epreuve>
         </epreuve>
         <epreuve>
             <numero de l'epreuve>02</numero de l'epreuve>
             <vainqueur>fifi</vainqueur>
         </epreuve>
         <epreuve>
             <numero de l'epreuve>03</numero de l'epreuve>
         </epreuve>
    </toto>
    <fifi>
         <epreuve>
             <numero de l'epreuve>02</numero de l'epreuve>
         </epreuve>
    </fifi>
    </vainqueur>
    Je sais que cela est tordu mais c'est la seul possibilité vu les contraintes qui me sont fixées.

    Quelqu'un pourrait me dire si cela est faisable de partir d'un fichier XML et de le réorganisé suivant certain critère de valeur de noeud. et si oui comment?

    Merci d'avance.
    Location saisonnière dans le Lot:
    http://www.lot-holidays.com

  2. #2
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Salut,

    Je ne connais pas de moyen simple de faire ce que tu demandes, il va de toutes manières te falloir faire du processing.

    Tu veux transformer une information linéaire, en regroupée, xml ou même xslt me semble-t-il ne te fourniront pas suffisament de moyen pour y arriver.

    L'algorithme en langage objet, tel que je l'imagine :

    Créer une collection de vainqueur.
    (lecture d'une ligne) Parcourir un element xml.
    Si ta collection de vainqueur ne contient pas le vainqueur, l'ajouter à ta collection
    Créer une collection pour d'epreuve pour ce vainqueur.
    ajouter l'epreuve gagnée à la collection de ton vainqueur en cours.
    Si ta collection contient le vainqueur, ajouter à sa collection d'epreuve l'epreuve en cours.
    Retour à l'étape de (lecture d'une ligne)
    K

  3. #3
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Mon système d'identation par flèches est mauvaise à ne pas refaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    // @TODO: Trouver un meilleur moyen de représenter un algo sur ce forum !
    K

  4. #4
    Membre régulier Avatar de biggione
    Inscrit en
    Juillet 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 99
    Points : 91
    Points
    91
    Par défaut
    merci, pense tu qu'une transformation XSLT du type:

    http://xml.developpez.com/faq/?page=3#xslt_regroup

    Suffirait?
    Location saisonnière dans le Lot:
    http://www.lot-holidays.com

  5. #5
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Cette méthode ne modifie pas la structure de base de ton fichier xml comme tu le voudrais, mais peut-être qu'en bidouillant tu peux y arriver.. Mais c'est de la grande bidouille je trouve!

    Ne peux-tu pas utiliser le fichier tel quel au fait ? qu'est-ce qui t'en empêche ?

    A+
    K

  6. #6
    Membre régulier Avatar de biggione
    Inscrit en
    Juillet 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 99
    Points : 91
    Points
    91
    Par défaut
    en fait voilà la vrai structure:

    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
    40
    41
    42
    43
     
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <Categorie>
               <Support>
                        <Demande>
                                 <Project_name>toto</Project_name>
                                 <id>2557</id>
                                 <Date_submitted>2004-05-30 13:46:08</Date_submitted>
                                 <Summary>Vicoto</Summary>
                                 <Date_modified>2007-05-32 13:46:08</Date_modified>
                                 <Modification>Elapsed time</Modification>
                                 <Priority>30</Priority><Status>70</Status>
                                 <ElapsedTime>0</ElapsedTime>
                                 <Special>Gui</Special>
                        </Demande>
               </Support>
               <Evolution>
                          <Demande>
                                   <Project_name>toto</Project_name>
                                   <id>1867</Bug>
                                   <Date_submitted>2007-01-07 12:10:25</Date_submitted>
                                   <Summary>Versions</Summary>
                                   <Date_modified>2007-09-22 15:28:43</Date_modified>
                                   <Modification>Elapsed time</Modification>
                                   <Priority>30</Priority>
                                   <Status>20</Status>
                                   <ElapsedTime>10</ElapsedTime>
                                   <Special>TELE</Special>
                          </Demande>
                          <Demande>
                                   <Project_name>fifi</Project_name>
                                   <id>1867</Bug>
                                   <Date_submitted>2007-01-07 12:10:25</Date_submitted>
                                   <Summary>Versions</Summary>
                                   <Date_modified>2007-09-22 15:28:43</Date_modified>
                                   <Modification>Elapsed time</Modification>
                                   <Priority>30</Priority>
                                   <Status>20</Status>
                                   <ElapsedTime>10</ElapsedTime>
                                   <Special>TELE</Special>
                          </Demande>
               </Evolution>
    </Categorie>

    Moi je voudrais

    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
     
    <Projet>
               <toto>
                          <Support>
                                 <id>2557</id>
                                 <Date_submitted>2004-05-30 13:46:08</Date_submitted>
                                 <Summary>Vicoto</Summary>
                                 <Date_modified>2007-05-32 13:46:08</Date_modified>
                                 <Modification>Elapsed time</Modification>
                                 <Priority>30</Priority><Status>70</Status>
                                 <ElapsedTime>0</ElapsedTime>
                                 <Special>Gui</Special>
                          </Support>
                          <Evolution>
                                   <id>1867</Bug>
                                   <Date_submitted>2007-01-07 12:10:25</Date_submitted>
                                   <Summary>Versions</Summary>
                                   <Date_modified>2007-09-22 15:28:43</Date_modified>
                                   <Modification>Elapsed time</Modification>
                                   <Priority>30</Priority>
                                   <Status>20</Status>
                                   <ElapsedTime>10</ElapsedTime>
                                   <Special>TELE</Special>
                          </Evolution>
               </toto>
               <fifi>
                          <Evolution>
                                   <id>1867</Bug>
                                   <Date_submitted>2007-01-07 12:10:25</Date_submitted>
                                   <Summary>Versions</Summary>
                                   <Date_modified>2007-09-22 15:28:43</Date_modified>
                                   <Modification>Elapsed time</Modification>
                                   <Priority>30</Priority>
                                   <Status>20</Status>
                                   <ElapsedTime>10</ElapsedTime>
                                   <Special>TELE</Special>
                          </Evolution>
               </fifi>
    </Projet>
    Comme tu peux le voir c'est à la fois de la réoganisation de noeud, les element deviennent attribut (toto et fifi)...

    Je pense pas que je puisse l'utiliser tel quel car une seconde appli doit reprendre le XML avec la forme que je souhaite avoir. La seconde appli n'est pas de moi et apparemment elle est déja bien avancée

    Donc voilà le truc c'est que XML n'est pas vraiment mon domaine de base...
    Location saisonnière dans le Lot:
    http://www.lot-holidays.com

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    Salut,
    Cela se fait bien avec un script xsl.
    Il aura pour but de te créer un nouveau document à l'effigie que tu veux (arborescence).
    Bref, le xsl n'est vraiment pas compliqué, et on l'apprend très rapidemment. C'est un outils puissant et parfaitement adapté à ce que tu veux faire.
    A +

  8. #8
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    c'est exactement pour répondre à ce genre de problématique que XSLT a été conçu.

    Donc, ton problème est facilement résolu par un peu de code XSLT (il m'a fallu moins de 10 minutes pour l'écrire et le tester) :
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:key name="projects" match="Project_name" use="." />
        <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
        <xsl:template match="Categorie">
            <Project>
                <xsl:for-each select="*/Demande/Project_name[generate-id(.) = generate-id(key('projects', .)[1])]">
                    <xsl:element name="{.}">
                        <xsl:for-each select="/Categorie/*/Demande[Project_name = current()]">
                            <xsl:element name="{name(..)}">
                                <xsl:copy-of select="*[not(self::Project_name)]" />
                            </xsl:element>
                        </xsl:for-each>
                    </xsl:element>
                </xsl:for-each>
            </Project>
        </xsl:template>
    </xsl:stylesheet>
    Citation Envoyé par biggione
    Donc voilà le truc c'est que XML n'est pas vraiment mon domaine de base...
    Ce n'est le domaine de base de personne, en tout cas ce n'est pas le mien. Mais XML et les technos qui tournent autour sont devenus indispensables dans la boîte à outils de la majorité des développeurs.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/08/2007, 13h25
  2. [XSLT] requete dans un fichier xml
    Par tourearc dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 14/06/2007, 11h21
  3. [XSLT] transfo d'un fichier XML en plusieurs fichiers XML
    Par doudou_rennes dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 28/11/2006, 12h01
  4. [XSLT] Comment lier un fichier XML et XSLT
    Par bitou dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 16/08/2006, 15h35
  5. XSLT traiter recursivement un fichier xml
    Par davelo dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 26/02/2006, 10h52

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