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 :

Tri XML via XSL pour fichier XML en sortie


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 3
    Par défaut Tri XML via XSL pour fichier XML en sortie
    Bonjour à tous,

    Je découvre les feuilles de style depuis peu (il n'es tjamais trop tard ) et j'aimerai utiliser le xsl:sort afin de trier un fichier XML existant pour le transformer dans un second.

    Voici le fichier XML exemple en input :

    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
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <mycompany>
    	<user IdUser="p-nom">
    		<year IdYear="2013">
    			<month IdMonth="zzzzjanuary">
    				<date>
    					<Value>01/01/2013<project>zzzR8.2</project>
    						<workload>5</workload>
    					</Value>
    					<Value>02/01/2013<project>R9</project>
    						<workload>3</workload>
    					</Value>
    				</date>
    			</month>
    			<month IdMonth="february">
    				<date>
    					<Value>01/02/2013<project>R82</project>
    						<workload>6</workload>
    					</Value>
    					<Value>09/01/2013<project>R88</project>
    						<workload>4</workload>
    					</Value>
    				</date>
    			</month>
     
    		</year>
    	</user>
    </mycompany>



    Mon objectif :
    * garder la même structure XML en sortie
    * trier par attribut IdMonth
    * trier par date (balise value)
    * trier par projet (balise projet)


    Qqun saurait il écrire le fichier XSL afin que je puisse avoir en sortie la même structure XML ?

    Merci de votre aide et de votre temps !


    Lorenzo

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    Citation Envoyé par Lorenzomax Voir le message
    Qqun saurait il écrire le fichier XSL afin que je puisse avoir en sortie la même structure XML ?
    Bien sûr !
    Pas mal de gens ici ont un bon niveau XSLT.

    Ce qu'il faut réaliser ici, avec ce que tu nous as montré :
    - on veut juste changer l'ordre des <month> dans chaque <year>. Tout le reste ça change pas.
    - donc ce qu'il faut changer, c'est le comportement sur <year>, qui doit redonner les <month>, mais dans un autre ordre, un ordre trié avec trois critères avec des <xsl:sort>.
    - tout le reste ça change pas, ça doit être recopié tel que.

    Allez, j'ajoute même deux squelettes de code :

    # Recopier un XML sans rien changer (transformation qui donne exactement la même chose donc ne transforme rien : )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <!-- Tous les éléments et les textes -->
    <xsl:template match="node()">
      <xsl:copy>
        <!-- s'il y a des attributs, les copier aussi -->
        <xsl:copy-of select="@*"/>
     
        <!-- s'il y a du contenu, appliquer les transformations à tout le contenu -->
        <xsl:apply-templates/>
      </xsl:copy>
    </xsl:template>
    # Recopier un doc XML comme le tien, mais en ajoutant Bonjour Zorglub ! devant chaque <month>

    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
    <!-- Tous les éléments et les textes -->
    <xsl:template match="node()">
      <xsl:copy>
        <!-- s'il y a des attributs, les copier aussi -->
        <xsl:copy-of select="@*"/>
     
        <!-- s'il y a du contenu, appliquer les transformations à tout le contenu -->
        <xsl:apply-templates/>
      </xsl:copy>
    </xsl:template>
     
    <!-- Pour les year c'est différent -->
    <xsl:template match="year">
      <xsl:copy>
        <!-- s'il y a des attributs, les copier aussi -->
        <xsl:copy-of select="@*"/>
     
        <!-- Boucler sur les month que ce year contient -->
        <xsl:for-each select="month">
          <xsl:text>Bonjour Zorglub !</xsl:text>
          <!-- Appliquer les transformation sur le month en cours -->
          <xsl:apply-templates select="."/>
        </xsl:for-each>
      </xsl:copy>
    </xsl:template>
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre expérimenté
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2007
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 199
    Par défaut
    on peut effectivement t'écrire le XSL (et même faire ton travail...) mais qu'as-tu essayé déjà ? Tu dois utiliser <xsl:sort>

    Edit: ha ben M Thelvin a déjà tout dit :-) voilà, y'a plus qu'à !

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    Finalement j'ai quand même donné des squelettes pour illustrer un peu.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 3
    Par défaut merci à vous deux mais petit pb :(
    Bonjour à tous et merci à vous deux d'avoir pris le temps de me répondre !

    Je m'essaies à l'écriture d'un XSL, mais j'avoue que je débute depuis peu (cette semaine!) et je suis loin encore d'en avoir compris la logique.

    J'ai essayé le XSL proposé mais rien n'y fait, je n'obtient pas le résultat escompét, aucune transfo ne s'opère, le résultat = le fichier source !

    Voici le bout de code vb script que j'utilise poiur faire la transfo :

    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
    44
    45
     
    'Mon fichier a traiter
    '***********************
    strInputFile = "timetracking_indented.xml"
     
    'Mon fichier resultat
    '***********************
    strOutputFile = "timetracking_indented_sorted.xml"
     
    'Mon fichier de style
    '***********************
    strStylesheet = "test.xsl"
     
     
     
    Set objXML = WScript.CreateObject("Msxml2.DOMDocument")
    Set objXSL = WScript.CreateObject("Msxml2.DOMDocument")
     
     
    ' Je charge mon XML à traiter
    '*****************************
    objXML.async = False
    objXML.Load strInputFile 
    If (objXML.parseError.errorCode <> 0) Then
       Set myErr = objXML.parseError
       MsgBox("You have XML error " & myErr.reason)
    Else
     
    'Je charge mon style
    '*******************
       objXSL.async = False
       objXSL.Load strStylesheet 
       If (objXSL.parseError.errorCode <> 0) Then
          Set myErr = objXSL.parseError
          MsgBox("You have XSL error " & myErr.reason)
       Else
    	'J'applique la transfo
    	'**********************
        	objXML.transformNode(objXSL)
     
    	' Enfin je sauvegarde mon resultat
    	'**********************************
    	objXML.save strOutputFile 
       End If
    End If
    Bref j'ai essayé mais aucune transfo opérée, sniff. Cela viendrait il de vb script ? du XSL ?

    cdt

    Lorenzo

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    Hum, j'y connais rien en VbScript, mais en principe une fonction comme transformNode() ne transforme pas vraiment l'objet sur lequel tu l'appliques.

    Elle est plutôt censée construire un nouvel objet qui contient le résultat de la transformation du document par la feuille de style, et renvoyer ce nouvel objet, tout en laissant le document d'origine inchangé.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre expérimenté
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2007
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 199
    Par défaut
    Le squelette XSL donné est bon...

    Pour t'affranchir des problèmes de VBScript, tu peux essayer de faire la transformation dans un outil XML (altova, oxygen, autres...) pour vérifier que ton XSL avec les tris est déjà correct.

    Ensuite tu vois le pb spécifique à VB.


    Edit : de mémoire, il me semble que sous IE quand tu appliques une transformation XSL à un fichier XML et que tu affiche la source, tu vois le résultat (à contrario de Firefox et Chrome qui ne t'affichent que le XML source), mais je n'ai pas IE pour te le confirmer

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 3
    Par défaut
    Bonjour à tous,

    J'ai enfin trouvé le pourquoi du non fonctionnement du XSL !

    Il fallait faire un appel à la classe de manière plus explicitive et rajouter .6.0 comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Set objXML = WScript.CreateObject("Msxml2.DOMDocument.6.0")
    Set objXSL = WScript.CreateObject("Msxml2.DOMDocument.6.0")
    Encore une fois merci à tous !

    Lorenzo

  9. #9
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    Il fallait faire un appel à la classe de manière plus explicitive et rajouter .6.0...
    Il vaut mieux de le faire en effet, mais ce n'est pas la raison. transformNode() retourne un string qui est le résultat que vous devrez regarder tout d'abord et puis sauveguardez à un fichier si vous voulez.
    Code vbscript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	'J'applique la transfo
    	'**********************
        	'objXML.transformNode(objXSL)
         	s=objXML.transformNode(objXSL)
     
    	' Enfin je sauvegarde mon resultat
    	'**********************************
    	'objXML.save strOutputFile 'ce n'est pas le résultat 
    	wscript.echo s
    addenda: Et ce ne serait pas xslt 2.0, il n'en a pas besoin d'abord, et puis msxml2 ne supporte que xslt 1.0.

Discussions similaires

  1. [PHP 4] Extraire des données d'un fichier xml via xsl et xpath
    Par fraisa1985 dans le forum Langage
    Réponses: 1
    Dernier message: 12/01/2010, 10h23
  2. Réponses: 1
    Dernier message: 22/04/2008, 11h24
  3. Réponses: 3
    Dernier message: 06/08/2007, 03h44
  4. [DOM] (org.w3c.dom) copier un noeud d'un fichier XML dans un autre fichier XML
    Par snoop dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 13/02/2007, 17h22
  5. Importer le contenu un fichier xml dans un autre fichier xml
    Par gedeon555 dans le forum XML/XSL et SOAP
    Réponses: 5
    Dernier message: 27/07/2005, 11h49

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