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 :

Trier puis ré-écrire le XML [XSLT 1.0]


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre régulier
    Inscrit en
    Juin 2005
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 72
    Points : 70
    Points
    70
    Par défaut Trier puis ré-écrire le XML
    Bonjour à tous,

    J'ai un XML en entrée:

    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
    <LOTS>
      <LstIDLOT>
        <IDLOT NLOT="1" TLOT="P2" DLOT="2014-06-25">
          <LstETAB>
            <ETAB>
              <IDETAB ID="1234" />
              <ADRESSE NOM1="TOTO" ADR1="rue toto" CPOS="75000" VIL="PARIS" />
              <LstEMAIL>
                <EMAIL TYPE="DIR" EMA="toto@toto.com" />
                <EMAIL TYPE="PROF" EMA="teacher2@toto.com" />
                <EMAIL TYPE="PROF" EMA="teacher1@toto.com" />
    		</LstEMAIL>
    		</ETAB>
    		<ETAB>
              <IDETAB ID="5678" />
              <ADRESSE NOM1="TITI" ADR1="rue titi" CPOS="75000" VIL="PARIS" />
              <LstEMAIL>
                <EMAIL TYPE="DIR" EMA="titi@titi.com" />
                <EMAIL TYPE="PROF" EMA="teacher15@titi.com" />
                <EMAIL TYPE="PROF" EMA="teacher9@titi.com" />
    		</LstEMAIL>
    		</ETAB>
    	<LstETAB>
    	</IDLOT>
    </LOTS>
    Je cherche à ré-écrire ce XML mais en ayant trié les emails. Et là je sêche :-(


    J'ai bien tenté un truc de ce genre mais ce n'est pas bon:

    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" ?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
    <xsl:output 
      method="xml"
      encoding="UTF-8"
      indent="no" />
     
    	<xsl:template match="LOTS">
    		<xsl:for-each select="LstIDLOT/IDLOT/LstETAB/ETAB/LstEMAIL/EMAIL">
    			<xsl:sort select="@EMA" data-type="text" order="ascending" />
    			<xsl:copy-of select="." />
    		</xsl:for-each>
     
    		<xsl:copy-of select="." />
     
    	</xsl:template>
    </xsl:stylesheet>

    Est-ce que quelqu'un aurait une petite idée svp ?

    D'avance merci.
    Cordialement

  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
    Si tu veux réécrire ce XML, la première chose à faire, c'est de le recopier tel que, sans rien changer du tout.
    Ça se fait comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
    <xsl:template match="node()|@*">
      <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
      </xsl:copy>
    </xsl:template>
     
    </xsl:stylesheet>
    Maintenant, tu veux recopier tel que, mais changer l'ordre des emails.
    Ça veut dire que l'élément <LstEMAIL>, qui contient les éléments <EMAIL>, ne doit pas être recopié tel que, il faut changer son contenu.

    Supposons que le changement que je veux faire, ce soit, n'afficher que les deux premiers emails.
    On ajouterait ce template en plus du précédant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <xsl:template match="LstEMAIL">
      <xsl:copy>
        <xsl:for-each select="EMAIL[2 >= position()]">
          <xsl:apply-templates select="."/>
        </xsl:for-each>
      </xsl:copy>
    </xsl:template>
    Je te laisse adapter pour que, au lieu d'afficher seulement les deux premiers emails, il les affiche tous, mais triés.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre régulier
    Inscrit en
    Juin 2005
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 72
    Points : 70
    Points
    70
    Par défaut
    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
    <?xml version="1.0" ?>
     
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
    <xsl:template match="node()|@*">
      <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
      </xsl:copy>
    </xsl:template>
     
     
    <xsl:template match="LstEMAIL">
      <xsl:copy>
        <xsl:for-each select="EMAIL">
    	<xsl:sort select="@EMA" data-type="text" order="ascending" />
            <xsl:apply-templates select="."/>
        </xsl:for-each>
      </xsl:copy>
    </xsl:template>
     
     
     
    </xsl:stylesheet>
    Merci beaucoup pour ton aide :-)
    Petite question: à quoi sert le apply-templates en dessous du sort ?

    Encore merci

  4. #4
    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
    Ben... C'est à prendre assez littéralement. "apply-tempates select current" => "appliquer les templates sur le nœud en cours de la boucle for."

    Dans ce for, tu indiques quel contenu tu veux mettre pour chaque <EMAIL> trouvé.
    => Si tu n'indiques rien, ça veut dire que le contenu que tu veux, c'est rien, donc pour chaque <EMAIL>, ne rien avoir, et donc que l'élément <LstEMAIL> soit juste vide.
    => Si tu indiques d'appliquer les templates (sur l'<EMAIL> actuellement parcouru par la boucle for,) tu repasses dans les templates et donc dans le système qui consiste à copier les éléments tels que. Et donc chaque <EMAIL> est copié tel que dans l'original.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre régulier
    Inscrit en
    Juin 2005
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 72
    Points : 70
    Points
    70
    Par défaut
    Je n'y comprend rien

    Mon code a un peu changé:
    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
    <LOTS>
      <LstIDLOT>
        <IDLOT NLOT="1" TLOT="P2" DLOT="2014-06-25">
          <LstETAB>
            <ETAB>
              <PAGE QTE="2">
              <IDETAB ID="1234" />
              <ADRESSE NOM1="TOTO" ADR1="rue toto" CPOS="75000" VIL="PARIS" />
              <LstEMAIL>
                <EMAIL TYPE="DIR" EMA="toto@toto.com" />
                <EMAIL TYPE="PROF" EMA="teacher2@toto.com" />
                <EMAIL TYPE="PROF" EMA="teacher1@toto.com" />
    		</LstEMAIL>
    		</ETAB>
    		<ETAB>
              <IDETAB ID="5678" />
              <ADRESSE NOM1="TITI" ADR1="rue titi" CPOS="75000" VIL="PARIS" />
              <LstEMAIL>
                <EMAIL TYPE="DIR" EMA="titi@titi.com" />
                <EMAIL TYPE="PROF" EMA="teacher15@titi.com" />
                <EMAIL TYPE="PROF" EMA="teacher9@titi.com" />
    		</LstEMAIL>
    		</ETAB>
            <ETAB>
              <PAGE QTE="5">
              <IDETAB ID="1234" />
              <ADRESSE NOM1="TOTO" ADR1="rue toto" CPOS="75000" VIL="PARIS" />
              <LstEMAIL>
                <EMAIL TYPE="DIR" EMA="toto@toto.com" />
                <EMAIL TYPE="PROF" EMA="teacher2@toto.com" />
                <EMAIL TYPE="PROF" EMA="teacher1@toto.com" />
    		</LstEMAIL>
    		</ETAB>
    		<ETAB>
              <IDETAB ID="5678" />
              <ADRESSE NOM1="TITI" ADR1="rue titi" CPOS="75000" VIL="PARIS" />
              <LstEMAIL>
                <EMAIL TYPE="DIR" EMA="titi@titi.com" />
                <EMAIL TYPE="PROF" EMA="teacher15@titi.com" />
                <EMAIL TYPE="PROF" EMA="teacher9@titi.com" />
    		</LstEMAIL>
    		</ETAB>
    	<LstETAB>
    	</IDLOT>
    </LOTS>
    Je souhaite faire un tri de la balise ETAB selon la quantité spécifiée dans PAGE.

    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
    <?xml version="1.0" ?>
     
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
    <xsl:template match="node()|@*">
      <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
      </xsl:copy>
    </xsl:template>
     
     
    <xsl:template match="IDLOT">
      <xsl:copy>
    	<xsl:for-each select="LstETAB" >
    		<xsl:sort select="ETAB/PAPER/@QTE" data-type="number" order="descending" />
    				<xsl:apply-templates select="."/>
    	</xsl:for-each>
     
      </xsl:copy>
    </xsl:template>
     
     
    </xsl:stylesheet>
    J'ai beau retourner le truc dans tous les sens, je ne trouve pas et qui plus est, les arguments des balises IDLOT ne sont plus repris.
    Bon OK je vous l'accorde je ne l'ai pas retourné dans tous les sens ... sinon j'aurais trouvé la solution.

    Si vous pouvez me donner une piste svp ? Ainsi que des bons liens de tutos ?
    Un grand merci

  6. #6
    Membre régulier
    Inscrit en
    Juin 2005
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 72
    Points : 70
    Points
    70
    Par défaut
    Petite précision: c'est et non

  7. #7
    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
    Ben, c'est pas du tout la technique que je t'ai montrée -_-°.

    - Pourquoi tu matches sur IDLOT et pas sur l'élément qui doit être modifié ?
    - Pourquoi tu sélectionnes des LstETAB et pas les éléments à trier ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre régulier
    Inscrit en
    Juin 2005
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 72
    Points : 70
    Points
    70
    Par défaut
    Je pensais de la sorte:
    1 LstETAB contient n ETAB contient 1 PAGE (ou PAPER, je ne sais plus comment elle est nommée)

    Vu que le tri doit se faire sur ETAB en fonction de l'attribut QTE de la balise PAGE, je pensais que je ne pouvais pas suivre ton exemple tel que.

  9. #9
    Membre régulier
    Inscrit en
    Juin 2005
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 72
    Points : 70
    Points
    70
    Par défaut
    J'ai modifié:

    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
    <?xml version="1.0" ?>
     
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
    <xsl:template match="node()|@*">
      <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
      </xsl:copy>
    </xsl:template>
     
     
    <xsl:template match="LstETAB">
      <xsl:copy>
    	<xsl:for-each select="ETAB" >
    		<xsl:sort select="PAPER/@QTE" data-type="number" order="descending" />
    				<xsl:apply-templates select="."/>
    	</xsl:for-each>
     
      </xsl:copy>
    </xsl:template>
     
     
    </xsl:stylesheet>
    Mais ça ne tri pas et la balise PAPER est supprimée

  10. #10
    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 lephotographe Voir le message
    [...] 1 PAGE (ou PAPER, je ne sais plus comment elle est nommée)
    Euh... Tu veux bien commencer par te remettre d'aplomb de ton côté et savoir comment sont nommées tes balises, d'abord, et venir nous dire ce que ça donne, ensuite ?
    C'est en général comme ça qu'on réussit à faire des trucs en informatique...

    Citation Envoyé par lephotographe Voir le message
    Vu que le tri doit se faire sur ETAB en fonction de l'attribut QTE de la balise PAGE, je pensais que je ne pouvais pas suivre ton exemple tel que.
    Ah pas tel que, non. Mais si ce qui change c'est le critère de tri, ben ce qu'il faut changer c'est le critère de tri, pas autre chose.

    Citation Envoyé par lephotographe Voir le message
    Mais ça ne tri pas et la balise PAPER est supprimée
    Vu que dans les messages du dessus tu nous montres du XML mal formé et tu nous dis que tu sais plus comment s'appellent les balises, je te laisse corriger tout ça d'abord. On verra les histoires de tri ensuite.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Membre régulier
    Inscrit en
    Juin 2005
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 72
    Points : 70
    Points
    70
    Par défaut
    Hello Thelvin

    J'ai repris mon petit dev ce matin et ça va mieux. Comme tu me l'as évoqué hier soir, le problème se situait entre la chaise et le clavier.

    Solution trouvée.

    Merci pour ta patience et ton aide.
    Si tu connais quelques bon liens ou ouvrages, je suis preneur.

    Merci encore

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

Discussions similaires

  1. écrire du xml en dotnet
    Par michael_MS dans le forum VB.NET
    Réponses: 5
    Dernier message: 18/12/2008, 11h45
  2. [XLinq] écrire du xml dans le code c#
    Par maa dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 25/07/2007, 01h06
  3. [XML] Outils pour écrire un XML sous AIX
    Par Lemming dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 04/05/2007, 11h40
  4. [2.0][C#]Trier les Balises d'un Xml
    Par totoen dans le forum C#
    Réponses: 4
    Dernier message: 21/11/2006, 10h57

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