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 :

Demande simple exemple de XSL [Débutant(e)] [XSLT 1.0]


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 23
    Points : 10
    Points
    10
    Par défaut Demande simple exemple de XSL
    Bonjour,

    C'est la première fois que j'essaye d'écrire un xsl donc je galère...
    J'aimerai avoir un exemple pour mieux comprendre le xls :
    Voici le genre de transformation que j'aimerai executer : xml --> xml.

    Voici le xml d'origine :
    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
     
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <row id="1">
    	<data id="1">John</data>
    	<data id="2">Freeman</data>
    	<data id="3">France</data>
    	<data id="4">2</data>
    </row>
    <row id="2">
    	<data id="1">Marc</data>
    	<data id="2">Kerry</data>
    	<data id="3">USA</data>
    	<data id="4">0</data>
    </row>
    ...
    Voici comment j'aimerai le formatter le xml après passage du xsl

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <Personne id = "1">
    	<Nom>John Freeman</Nom>
    	<Pays>France></Pays>
    </Personne>
    <Personne id = "2">
    	<Nom>Marc Kerry</Nom>
    	<Pays>USA></Pays>
    	<enfant>2</enfant>
    </Personne>
    Vous remarquerez que le tag <enfant> n'est rempli que si la valeur <data id="4"> est + grand que 0

    Voici un gabarit de mon xsl mais je n'arrive pas à aller plus loin :

    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
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output 
      method="xml"
      encoding="ISO-8859-1"
      indent="yes" />
     
    <xsl:template match="row">
    	<xsl:apply-templates select="data" />
    </xsl:template>
     
    <xsl:template match="data">
     
    	<xsl:if test="@id = 1">
    	<Nom>
        <xsl:value-of select="." />
    	</Nom>
    	</xsl:if>
     
    </xsl:template>
     
    </xsl:stylesheet>
    Pouvez-vous m'aider ?

    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 845
    Points
    4 845
    Par défaut
    Dans ton cas, il ne vaut mieux pas faire de template pour data.
    Le plus simple à mon sens est de faire le traitement dans le template de row :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <xsl:template match="row">
      <Personne id="{@id}">
        <Nom><xsl:value-of select="data[@id=1]"/> <xsl:value-of select="data[@id=2]"/></Nom>
        <!-- etc. -->
      </Personne>
    </xsl:template>

  3. #3
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 29
    Points : 19
    Points
    19
    Par défaut
    tiens, ça me rassure, j'aurais fait ça également.

    J'ajoute que pour faire un if pour afficher seulement si enfant > 0, tu peux utiliser un xsl:if et la syntaxe est d'utiliser &lt; pour >

    http://www.w3schools.com/xsl/xsl_if.asp

    Bon courage !

  4. #4
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 23
    Points : 10
    Points
    10
    Par défaut
    Ah effectivement, c'est + logique et + simple.

    Merci pour ces renseignements

  5. #5
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 23
    Points : 10
    Points
    10
    Par défaut
    Re-bonjour,

    Puis-je vous soumettre une autre exemple de formatage xsl où je bloque ?

    Considérons ce fichier 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
    <root>
    	<row id="1">
    		<data id="1">A</data>
    		<data id="2">10</data>
    		<data id="3">bloc A</data>
    	</row>
    	<row id="2">
    		<data id="1">B</data>
    		<data id="2">17</data>
    		<data id="3">bloc B</data>
    	</row>
    	<row id="3">
    		<data id="1">C</data>
    		<data id="2">15</data>
    		<data id="3">bloc C</data>
    	</row>
    	<row id="4">
    		<data id="1">B</data>
    		<data id="2">5</data>
    		<data id="3">AUTRE</data>
    	</row>
    </root>
    Je voudrais le formatter comme ceci :

    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
    <Ligne>
    	<Identifiant>A</Identifiant>
    	<montant>10</montant>
    	<description>bloc A</description>
    </Ligne>
    <Ligne>
    	<Identifiant>B</Identifiant>
    	<montant>22</montant>
    	<description>bloc B</description>
    </Ligne>
    <Ligne>
    	<Identifiant>C</Identifiant>
    	<montant>17</montant>
            <montantSupp>5<montantSupp>
    	<description>bloc C</description>
    </Ligne>
    La spécificité est qu'il y a eu un regroupement du bloc <row id="2"> et <row id="4> avec l'ajout de <montantSupp>5<montantSupp> qui correspond au data id=2
    Pourquoi ? car la valeur <data id="1"> est identique dans ces 2 blocs.

    Comment faire cela ? y'a-t-il des fonctions spécifiques ?

    Merci d'avance.

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 554
    Points : 21 613
    Points
    21 613
    Par défaut
    Techniquement il s'agit d'un groupement.
    Il faut regrouper et traiter ensemble les <row> qui ont le même <data id="2">

    En XSLT 2.0 ça se fait très facilement avec xsl:for-each-group

    En XSLT 1.0 c'est la merde. Il faut utiliser une méthode Muench, et c'est des nœuds au cerveau, il faut s'entraîner et comprendre.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 23
    Points : 10
    Points
    10
    Par défaut
    Merci bien.

    je vais regarder cela.

  8. #8
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 23
    Points : 10
    Points
    10
    Par défaut
    En essayant/cherchant, je me demande s'il n'est pas possible d'utiliser la fonction following-sibling: pour trouver s'il existe un valeur identique dans les éléments suivants.

    Voici ce que je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <xsl:choose>
    	<xsl:when test="(data[@id=1] = following-sibling::row/data[@id=1])">
    		<montantSupp> ???  </montantSupp>
    		<!-- Mon but est de récupérer la valeur de <data id="2"> de l'élement trouvé par le following-sibling ==> 5 -->
    	</xsl:when>
    	<xsl:otherwise>
    	</xsl:otherwise>
    </xsl:choose>
    Par contre, comme ecrit en commentaire, je ne vois pas comment récupérer les valeurs de l'élement suivant trouvé par le following-sibling ???

    Si vous savez, merci d'avance de m'éclairer
    edit : en xsl 1.0

  9. #9
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 554
    Points : 21 613
    Points
    21 613
    Par défaut
    Citation Envoyé par PhildarZ Voir le message
    En essayant/cherchant, je me demande s'il n'est pas possible d'utiliser la fonction following-sibling: pour trouver s'il existe un valeur identique dans les éléments suivants.
    Sisi, mais, c'est encore plus compliqué que la méthode Muench standard. Utilise plutôt le lien que je t'ai montré.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 23
    Points : 10
    Points
    10
    Par défaut
    J'ai essayé avec la function Muench (et le lien fourni) mais je n'y suis pas complètement arrivé.

    Avec la fonction following-sibling: et mon exemple, ça fonctionne.
    Ma seule difficulté est de pouvoir récupérer la valeur de <data id="2"> de l'élement trouvé par le following-sibling.
    Pour mon cas précis, je pense que cela sera + simple avec cette fonction.

    Ca doit être possible non ? ( dans une variable ou autre ?).

    Avec cela, mon regroupement sera réussi.

    Merci.

  11. #11
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 554
    Points : 21 613
    Points
    21 613
    Par défaut
    Citation Envoyé par PhildarZ Voir le message
    J'ai essayé avec la function Muench (et le lien fourni) mais je n'y suis pas complètement arrivé.
    D'une autre manière non plus. Je ne l'ai pas tiré de mon chapeau. Fais-moi confiance.

    Montre un peu avec quoi tu t'es exercé à la méthode Muench, et ce que tu as essayé pour ton cas : quelle est la clé, le use, comment énumères-tu les cas uniques ?

    Citation Envoyé par PhildarZ Voir le message
    Pour mon cas précis, je pense que cela sera + simple avec cette fonction.
    Non. C'est pareil que tous les regroupements.

    Citation Envoyé par PhildarZ Voir le message
    Ca doit être possible non ? ( dans une variable ou autre ?).
    Possible oui. Mais c'est plus compliqué.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 23
    Points : 10
    Points
    10
    Par défaut
    Je ne connais pas assez le xslt pour mettre en place la méthode Muench :/
    Y'a trop de trucs que je ne comprends pas :/

  13. #13
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 554
    Points : 21 613
    Points
    21 613
    Par défaut
    Eh bien allons-y par étape, alors.

    Fais fonctionner l'exemple donné dans la FAQ, mais en remplaçant les <t> par des <d>. Et copie/colle tout ça ici.
    Si tu veux faire des étapes un peu plus ambitieuses, ne te gêne surtout pas.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  14. #14
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 23
    Points : 10
    Points
    10
    Par défaut
    Voici où j'en suis avec la méthode Muench :

    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
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="ISO-8859-1" indent="yes" />
     
     
    <xsl:key name="X" match="row" use="data[@id=17]"/>
     
    	<xsl:template match="/">
     
    	    <xsl:for-each select="//row[generate-id(.)=generate-id(key('X', data[@id=17])[1])]">
     
    	        <transaction>
    	        <identifiant><xsl:value-of select="data[@id=17]"/></identifiant>
     
    	        <xsl:for-each select="key('X', data[@id=17])">
     
    	            <description><xsl:value-of select="data[@id=26]"/></description>
    	        </xsl:for-each>
    	        </transaction>
    	    </xsl:for-each>
    	</xsl:template>
     
    </xsl:stylesheet>
    ce qui donne ceci :

    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
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <ligne>
    	<identifiant>AA</identifiant>
    	<description>1</description>
    </ligne>
    <ligne>
    	<identifiant>BB</identifiant>
    	<description>2</description>
    	<description>REGROUPEMENT OK</description>
    </ligne>
    <ligne>
    	<identifiant>CC</identifiant>
    	<description>3</description>
    </ligne>
    <ligne>
    	<identifiant>DD</identifiant>
    	<description>4</description>
    </ligne>
    <ligne>
    	<identifiant>EE</identifiant>
    	<description>6</description>
    </ligne>
    Le regroupement se fait bien
    Mais au lieu d'avoir <description>REGROUPEMENT OK</description>
    J'aimerai avoir un autre tag <supp>REGROUPEMENT OK</supp>

  15. #15
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 845
    Points
    4 845
    Par défaut
    Ben il suffit d'écrire <supp><xsl:value-of select="data[@id=26]"/></supp> au lieu de <description><xsl:value-of select="data[@id=26]"/></description>.

    C'est pourtant pas compliqué par rapport à Muench ça.

  16. #16
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 23
    Points : 10
    Points
    10
    Par défaut
    lol merci mais en fait ce que je voulais dire, c'est que en cas de regroupement, je ne desire pas avoir 2 tags les même mais un tag <description> et un tag <supp>.

    J'ai solutionné cela en remplacement le 2ième for each par ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <description><xsl:value-of select="key('X', data[@id=17])[1]/data[@id=26]"/></description>
    <supp><xsl:value-of select="key('X', data[@id=17])[2]/data[@id=26]"/></supp>
    Ca fonctionne mais ca ne me semble pas super propre ?

  17. #17
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 554
    Points : 21 613
    Points
    21 613
    Par défaut
    Ah, d'accord, je commence à comprendre d'où venait l'idée de preceding-sibling.

    Tu as le choix :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:for-each select="key('X', data[@id=17])[position() > 1]">
    Ou bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:for-each select="following-sibling::row[data[@id=17] = $id]">
    Effectivement. L'usage de key() a garanti que celui qu'on utilise dans la boucle est le premier. Ses following-sibling seront donc les autres, en effet.

    Il y a encore d'autre solutions, mais ce sont mes préférées.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  18. #18
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 23
    Points : 10
    Points
    10
    Par défaut
    Merci thelvin pour ton aide et tes conseils

  19. #19
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 23
    Points : 10
    Points
    10
    Par défaut
    Au fait si je peux abuser....

    Donc, dans mon xsl, je fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <xsl:key name="X" match="row" use="data[@id=17]" />
    ...
    <xsl:for-each select="//row[generate-id(.)=generate-id(key('X', data[@id=17])[1])]">
    	<xsl:call-template name="printTag">
    		<xsl:with-param name="data" select="node()" />
    	</xsl:call-template>
    ...
    et mon template printTag :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:template name="printTag">
    	<xsl:param name="data" />
    	<Identifiant><xsl:value-of select="$data[@id=17]" /></Identifiant>
    	<Description><xsl:value-of select="$data[@id=26]"/></Description>
             ...
    Ce qui fonctionne

    Plus loin dans le xsl, je fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <xsl:variable name="secondElement" select="key('X', data[@id=17])[2]" />
    	<xsl:call-template name="printTag">
    		<xsl:with-param name="data" select="$secondElement" />
    	</xsl:call-template>
    Ce qui ne fonctionne pas...
    Le template printTag ne reçoit pas correctement les valeurs en paramètre !!!
    Je crois que je dois "caster" les valeurs envoyées non ?

  20. #20
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 554
    Points : 21 613
    Points
    21 613
    Par défaut
    Plus ou moins... Il semble que tu aies oublié /data après $secondElement
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. [CR 10] SQL Expression Field : Demande d'exemple ?
    Par caviar dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 19/06/2010, 14h36
  2. demande d'exemples de parallélisation
    Par fatjoe dans le forum C++
    Réponses: 5
    Dernier message: 02/02/2008, 16h35
  3. Demande simple, requete complexe, 3 lignes :)
    Par project131 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 07/12/2007, 01h22
  4. [JDOM] simple exemple avec jdom
    Par fatenatwork dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 27/09/2007, 15h55
  5. demande aide pour XML/XSL
    Par Jarod51 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 11/01/2006, 19h10

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