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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2006
    Messages : 5
    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 confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    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 :resolu: (en bas)

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Canada

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

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2006
    Messages : 5
    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 confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    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 :resolu: (en bas)

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2006
    Messages : 5
    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.

+ 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