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]Choisir l'ordre des noeuds d'un fichier xml en prenant exemple sur un autre fichier xml


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Candidat au Club
    Inscrit en
    Septembre 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 3
    Points : 2
    Points
    2
    Par défaut [XSLT]Choisir l'ordre des noeuds d'un fichier xml en prenant exemple sur un autre fichier xml
    Bonjour,

    Cela fait quelques jours que je suis bloqué sur le même problème, alors si quelqu'un peut me donner une piste je lui en serai très reconnaissant!

    Pour résumer, je veux trier les noeuds d'un fichier xml, grâce à un xsl, de manière à suivre l'ordre présent dans un autre xml.

    Dans mon xml 1, j'ai des noeuds "ville" et "village" qui sont au même niveau, les villes d'abord, les villages ensuite. Et chaque noeud a des noeuds childs et des attributs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <ville nom="Paris" departement="75">
         <rue nom="Bbbb"/>
    </ville>
    <ville nom="Lyon" departement="69">
         <rue nom="Aaaa"/>
    </ville>
    <ville nom="Toulouse" departement="31">
         <rue nom="Abcd"/>
    </ville>
    <village nom="village1"/>
    <village nom="village2"/>
    Dans mon xml 2, j'ai ce à quoi doit ressembler le xml final, mais je n'ai que les
    noeuds ville et village, et leur attribut "nom" qui sert à les reconnaître:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    <ville nom="Paris"/>
    <village nom="village2"/>
    <ville nom="Toulouse"/>
    <village nom="village1"/>
    <ville nom="Lyon"/>
    L'objectif est donc soit de prendre le xml 2 et d'y recopier les attributs piochés dans le xml 1, soit de prendre le xml 1 qui contient les noeuds complets et d'y appliquer l'ordre du xml 2

    J'ai essayé les 2, sans succès, je peux vous donner mes sources si vous le souhaitez. J'écris ici surtout pour savoir si par hasard il y aurait une méthode toute simple permettant d'appliquer l'ordre d'un xml à un autre xml.

    Merci d'avance

    Ps: j'ai découvert les xslt il y a moins d'un mois, merci d'être indulgent si ma question paraît stupide ;-)

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Février 2009
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Février 2009
    Messages : 155
    Points : 231
    Points
    231
    Par défaut
    Bonjour,

    Avec un fichier xml1 =
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?xml version="1.0" encoding="UTF-8"?>
    <xml1><ville nom="Paris" departement="75">
    	<rue nom="Bbbb"/>
    </ville>
    	<ville nom="Lyon" departement="69">
    		<rue nom="Aaaa"/>
    	</ville>
    	<ville nom="Toulouse" departement="31">
    		<rue nom="Abcd"/>
    	</ville>
    	<village nom="village1"/>
    	<village nom="village2"/>
    </xml1>
    et un fichier xml2 =
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/xsl" href="PROG.XSL"?>
    <xml2>
    	<ville nom="Paris"/>
    	<village nom="village2"/>
    	<ville nom="Toulouse"/>
    	<village nom="village1"/>
    	<ville nom="Lyon"/>
    </xml2>
    le programme XSL traitant xml2 pourrait être
    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
     
    <xsl:output encoding="utf-8" method="xml" media-type="text/xml"/>
     
    <xsl:param name="ficxml1" select="'xml1.xml'" />
    <xsl:variable name="xml1" select="document( $ficxml1 )/xml1" />
     
    <xsl:template match="xml2">
    	<xsl:for-each select="child::*">
    		<xsl:variable name="v" select="@nom"/>
    		<xsl:copy-of select="$xml1/child::*[@nom = $v]"/>
    	</xsl:for-each>
    </xsl:template>
     
    </xsl:stylesheet>

  3. #3
    Candidat au Club
    Inscrit en
    Septembre 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup, je vais tester ça asap, et je te dirai si c'est résolu
    Par contre, je lance le xsl par une commande java, et je ne vois pas dans ton programme de référence au fichier "xml2.xml".
    Je me demande à quel moment le programme va voir à l'intérieur de xml2.xml

  4. #4
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    Citation Envoyé par realestate Voir le message
    Par contre, je lance le xsl par une commande java, et je ne vois pas dans ton programme de référence au fichier "xml2.xml".
    Je me demande à quel moment le programme va voir à l'intérieur de xml2.xml
    Parce que lui c'est au fichier xml2 qu'il applique le xslt et c'est dans le code xslt qu'il fait la liaison avec le premier fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <xsl:param name="ficxml1" select="'xml1.xml'" />
    <xsl:variable name="xml1" select="document( $ficxml1 )/xml1" />

  5. #5
    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,
    Citation Envoyé par Krantz Voir le message
    le programme XSL traitant xml2 pourrait être
    Juste un détail : il n'est pas utile d'utiliser une variable pour référencer l'élément courant, il suffit d'utiliser la fonction current() (une extension de XSLT à XPath) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:template match="xml2">
    	<xsl:for-each select="child::*">
    		<xsl:copy-of select="$xml1/child::*[@nom = current()/@nom]"/>
    	</xsl:for-each>
    </xsl:template>

  6. #6
    Candidat au Club
    Inscrit en
    Septembre 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    ça marche très bien merci!

    J'ai juste une remarque, la disposition n'est pas idéale, mais je vais me débrouiller pour trouver comment faire.

    A la place de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    <ville nom="Paris" departement="75">
         <rue nom="Bbbb"/>
    </ville>
    <village nom="village2"/>
    <ville nom="Toulouse" departement="31">
         <rue nom="Abcd"/>
    </ville>
    <village nom="village1"/>
    <ville nom="Lyon" departement="69">
         <rue nom="Aaaa"/>
    </ville>
    J'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    <ville nom="Paris" departement="75">
         <rue nom="Bbbb"/>
    </ville><village nom="village2"/><ville nom="Toulouse" departement="31">
    <rue nom="Abcd"/>
    </ville><village nom="village1"/><ville nom="Lyon" departement="69">
    <rue nom="Aaaa"/>
    </ville>
    Mais sinon l'ordre est bon! Merci encore

  7. #7
    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
    Citation Envoyé par realestate Voir le message
    J'ai juste une remarque, la disposition n'est pas idéale, mais je vais me débrouiller pour trouver comment faire.
    Ces petits problèmes d'indentation écorchent certes un petit peu l'oeil, mais ils n'ont pas de répercussion par ailleurs, sauf dans des cas très spécifiques où les espaces entre balises ont une signification et peuvent entraîner des effets de bord. Généralement, ce genre de détail ne vaut pas la peine qu'on y consacre du temps et du code...

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

Discussions similaires

  1. choisir l'ordre des colonnes sur un histogramme vbar
    Par distro dans le forum ODS et reporting
    Réponses: 2
    Dernier message: 08/02/2009, 22h32
  2. [XPATH] [DOM4J] Ordre des noeuds
    Par cdespont dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 13/05/2008, 11h24
  3. treeview - Ordre des Noeuds et BDD
    Par Elwe31 dans le forum VB.NET
    Réponses: 2
    Dernier message: 20/03/2008, 10h25
  4. [XSLT] compte et affichage des noeuds distincts
    Par xoubidur dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 31/01/2007, 12h08
  5. [XSLT]Modifier l'ordre des balises XML
    Par Philos15 dans le forum XSL/XSLT/XPATH
    Réponses: 12
    Dernier message: 18/10/2006, 09h54

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