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]Problèmes pour regrouper selon l'attribut


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut [XSLT]Problèmes pour regrouper selon l'attribut
    Bonjour,

    Je suis nouveau dans l'utilisation du XSLT et j'ai beaucoup de difficulté à faire ce dont j'ai besoin. J'ai un document XML semblable à 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
     
    <?xml version="1.0" encoding="ISO-8859-1" ?>
    <?xml-stylesheet href="class1.xsl" type="text/xsl" ?>
    <aaa>
    	<bbb><nom>Pierre Tremblay</nom>
    		<ddd no="1111" montant="10" />
    		<ddd no="3333" montant="20" />
    		<ddd no="2222" montant="30" />
    	</bbb>
    	<bbb><nom>Roger Lamothe</nom>
    		<ddd no="1111" montant="10" />
    		<ddd no="2222" montant="20" />
    	</bbb>
    </aaa>

    Comment puis-je arriver à regrouper tous les attributs "no" indentique et faire la somme des attributs montant?

    Par exemple pour me sortir un tableau semblable à ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    NO          COUNT    SUM
    1111         2           20
    2222         2           50
    3333         1           20
    J'ai essayé ceci, mais on m'affiche toujours le contenu du tag "nom". Qu'est-ce qui n'est pas correct?

    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
     
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="aaa">
    <html>
    <body>
    <table border="1">
    <xsl:apply-templates select="*" />
    </table>
    </body>
    </html>
    </xsl:template>
     
    <xsl:template match="ddd">
    <xsl:if 
    test="generate-id(//ddd[@no=current()/@no]) 
    = generate-id(.)" >
    <tr>
    <td><xsl:value-of select="current()/@no" /></td> 
    <td><xsl:value-of select="count(//ddd[@no=current()/@no])" /></td></tr>
    </xsl:if>
    </xsl:template>
     
    </xsl:stylesheet>
    Merci beaucoup.

  2. #2
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Salut !

    le xsl:if ne sert à rien en fait... je pense qu'il te faudrait plutôt quelque chose dans ce style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <xsl:key name="Kddd" match="ddd" use="@no"/>
    [...]
    <xsl:for-each select="//ddd[generate-id(.)=generate-id(key('Kddd', @no)[1])]">
       <xsl:sort select="@no"/>
       <tr>
          <td><xsl:value-of select="@no"/></td>
          <td><xsl:number value="count(key('Kddd', @no))"/></td>
          <td><xsl:numbre value="sum(key('Kddd', @no))"/></td>
       </tr>
    </xsl:for-each>
    l'utilisation de la clée est inspirée de la : Comment supprimer les doublons dans un affichage ?
    elle permet en fait de regrouper directement les ddd par valeur de leur attribut @no

    J'en ai en plus profiter pour ajouter un petit tri sur les valeurs de ces attributs...

    Tu peux séparer le for-each en deux et le transformer en template ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <xsl:template match="ddd">
       <tr>
          <td><xsl:value-of select="@no"/></td>
          <td><xsl:number value="count(key('Kddd', @no))"/></td>
          <td><xsl:numbre value="sum(key('Kddd', @no))"/></td>
       </tr>
    </xsl:template>
     
    [...]
     
    <xsl:apply-template select="//ddd[generate-id(.)=generate-id(key('Kddd', @no)[1])]">
       <xsl:sort select="@no"/>
    </xsl:apply-template>
    mais je ne suis pas vraiment sûr que ce soit beaucoup plus lisible...


    Bonne continuation
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup pour ton aide, c'est grandement apprécié.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Est-ce qu'il y a une autre façon de le faire sans utiliser la fonction key() ? Car, c'est la contrainte qu'on m'a donné (exercise à l'Université). Je trouve dommage de ne pas prendre cette façon, car ça me semble être la solution parfaite.

  5. #5
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    bien sûr... après tout, l'expression permet ici simplement de remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //ddd[@no = current()/@no]
    (me semble-t-il)

    bien sûr; les clés ne sont pas uniquement un sucre syntaxique, il y a aussi des mécanismes de cache présents derrière qui permettent d'augmenter grandement la rapidité d'exécution du script
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Swoög
    bien sûr... après tout, l'expression permet ici simplement de remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //ddd[@no = current()/@no]
    (me semble-t-il)

    bien sûr; les clés ne sont pas uniquement un sucre syntaxique, il y a aussi des mécanismes de cache présents derrière qui permettent d'augmenter grandement la rapidité d'exécution du script
    C'est ce que j'avais essayé auparavant, mais le résultat que j'obtiens, c'est ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Pierre Tremblay 
    1111	2
    3333	1
    2222	2
    Roger Lamothe
    1111	3
    2222	4
    Les éléments "nom" sont affichés et en plus, ils ne sont pas regroupés, ils sont en double.

  7. #7
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    tu pourrais préciser le code XSLT que tu emplois exactement, puisque ça me semble un comportement impossible avec le code qu'on a utilisé jusqu'à présent...
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    J'ai trouvé la solution. Finalement, la solution se trouvais dans mon premier ébauche. J'ai mis en gras les deux lignes que j'ai modifiés et j'obtiens le résultat voulu.

    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
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="aaa">
    <html>
    <body>
    <table border="1">
    <xsl:apply-templates select="/aaa/bbb/ddd" />
    </table>
    </body>
    </html>
    </xsl:template>
    
    <xsl:template match="/aaa/bbb/ddd">
    <xsl:if 
    test="generate-id(//ddd[@no=current()/@no]) 
    = generate-id(.)" >
    <tr>
    <td><xsl:value-of select="current()/@no" /></td> 
    <td><xsl:value-of select="count(//ddd[@no=current()/@no])" /></td></tr>
    </xsl:if>
    </xsl:template>
    
    </xsl:stylesheet>
    Encore une fois, merci beaucoup pour ton aide.

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

Discussions similaires

  1. [AC-2007] Problème pour regrouper des valeurs
    Par christophe31 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 23/03/2010, 17h25
  2. [Toutes versions] problème pour regrouper des valeurs de cellules tout en respectant l'ordre
    Par songs_of_liberty dans le forum Excel
    Réponses: 5
    Dernier message: 16/04/2009, 18h43
  3. Réponses: 4
    Dernier message: 08/11/2008, 15h05
  4. [XSLT] Problème pour : XML + XSLT(ou XSL) = XML
    Par jenfree dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 18/04/2007, 17h28
  5. Réponses: 2
    Dernier message: 20/11/2006, 20h22

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