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 :

[XSL 2.0] Group-By multiple value


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 331
    Points : 180
    Points
    180
    Par défaut [XSL 2.0] Group-By multiple value
    Bonjour,

    Je viens de découvrir le XSL 2.0 qui semble bien plus puissant que le 1.0.

    J'essaye de faire un group-by sur de multiple valeur mais je ne sais pas du tout comment m'y prendre

    Exemple

    XML Entrant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <root>
    	<commande article_id="1" client_id="1" date_achat="01/01/2009"/>
    	<commande article_id="1" client_id="1" date_achat="25/01/2009"/>
    	<commande article_id="3" client_id="2" date_achat="01/01/2009"/>
    	<commande article_id="1" client_id="1" date_achat="01/01/2009"/>
    	<commande article_id="2" client_id="2" date_achat="09/01/2009"/>
    	<commande article_id="4" client_id="2" date_achat="05/01/2009"/>
    	<commande article_id="5" client_id="1" date_achat="01/01/2009"/>
    	<commande article_id="3" client_id="2" date_achat="12/01/2009"/>
    	<commande article_id="2" client_id="1" date_achat="12/01/2009"/>
    	<commande article_id="6" client_id="1" date_achat="06/01/2009"/>
    </root>

    XML SORTANT
    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
     
    <groups>
    	<group article_id="1" client_id="1">
    		<commande article_id="1" client_id="1" date_achat="01/01/2009"/>		
    		<commande article_id="1" client_id="1" date_achat="25/01/2009"/>
    		<commande article_id="1" client_id="1" date_achat="01/01/2009"/>
    	</group>
    	<group article_id="3" client_id="2">
    		<commande article_id="3" client_id="2" date_achat="01/01/2009"/>
    		<commande article_id="3" client_id="2" date_achat="12/01/2009"/>
    	</group>
    	<group article_id="2" client_id="2">
    		<commande article_id="2" client_id="2" date_achat="09/01/2009"/>
    	</group>
    	<group article_id="4" client_id="2">
    		<commande article_id="4" client_id="2" date_achat="05/01/2009"/>
    	</group>
    	<group article_id="5" client_id="1">
    		<commande article_id="5" client_id="1" date_achat="01/01/2009"/>
    	</group>
    	<group article_id="2" client_id="1">
    		<commande article_id="2" client_id="1" date_achat="12/01/2009"/>
    	</group>
    	<group article_id="6" client_id="1">
    		<commande article_id="6" client_id="1" date_achat="06/01/2009"/>
    	</group>
    </groups>
    J'aimerai donc faire un group-by sur article_id et client_id.

    Pour l'instant, mon XSL ressemble à ça :

    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
     
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    	<xsl:output  method="xml" indent="yes" omit-xml-declaration="yes"/>
     
    <xsl:template  match="/root">
    	<xsl:for-each-group  select="commande" group-by="@article_id, @client_id">
    		<node article="{@article_id}" client="{@client_id}">
    			<xsl:apply-templates  select="current-group()"/>
    		</node>
    	</xsl:for-each-group>
    </xsl:template>
    <xsl:template match="commande">
    	<date><xsl:value-of select="@date_achat"/></date>
    </xsl:template>
    </xsl:stylesheet>
    Une idée de comment je dois m'y prendre ?

  2. #2
    Expert confirmé
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Points : 4 045
    Points
    4 045
    Par défaut
    Je ne crois pas que tu puisses regrouper de la sorte sur 2 clés: dans ce cas il faire soit un concat, soit imbriquer 2 <xsl:for-each-group .

    Ensuite une fois le regroupement effectuer tu peux faire un <xsl:for-each select="current-group()"> et générer tes commandes (via un xsl:copy).

    Cela donnerait donc une structure telle que:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <xsl:for-each-group ...  premier regroupement @article_id
          <xsl:for-each-group ... second regroupement  @client_id
              <xsl:for-each select="current-group()">
                  ... copy de la commande
    ERE
    Quand une tête pense seule, elle devient folle.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 331
    Points : 180
    Points
    180
    Par défaut
    Ok, merci. ça fonctionne.

    Pour info, voici mon XSL final

    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
     
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    	<xsl:output  method="xml" indent="yes" omit-xml-declaration="yes"/>
     
    <xsl:template  match="/root">
    	<xsl:for-each-group  select="commande" group-by="@article_id">
    		<xsl:for-each-group  select="current-group()" group-by="@client_id">
    			<node article="{@article_id}" client="{@client_id}">
    				<xsl:apply-templates  select="current-group()"/>
    			</node>
    		</xsl:for-each-group>
    	</xsl:for-each-group>
    </xsl:template>
    <xsl:template match="commande">
    	<date><xsl:value-of select="@date_achat"/></date>
    </xsl:template>
    </xsl:stylesheet>

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

Discussions similaires

  1. GROUP BY Multiple - Que pensez-vous de ma solution ?
    Par arnolem dans le forum Requêtes
    Réponses: 4
    Dernier message: 14/09/2010, 10h16
  2. GROUP BY multiples (Performance)
    Par Erakis dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 01/02/2010, 16h51
  3. [SBI BIRT] Erreur de transformation quand Birt utilise Allow Multiples values
    Par atee dans le forum SpagoBI
    Réponses: 1
    Dernier message: 23/04/2009, 17h09
  4. [2.2.1] Report parameters - Allow multiple values
    Par JahPil78 dans le forum BIRT
    Réponses: 4
    Dernier message: 26/02/2008, 18h36
  5. [XSLT] combiner xsl:for-each-group et tokenize() ?
    Par Goulu dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 19/12/2006, 15h54

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