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] Regroupement


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Candidat au Club
    Inscrit en
    Avril 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut [XSLT] Regroupement
    Bonjour a tous et merci par avance. Je souhaite faire le regroupement d'un fichier xml suivant :
    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <LzMessage>
    	<LzOmnibus>
    		<LzAllocationDetail>
    			<LzAccountId>Fund1</LzAccountId>
    			<LzQuantity>500</LzQuantity>
    			<LzStrategy>Strat1</LzStrategy>
    		</LzAllocationDetail>
    		<LzAllocationDetail>
    			<LzAccountId>Fund2</LzAccountId>
    			<LzQuantity>600</LzQuantity>
    			<LzStrategy>Strat2</LzStrategy>
    		</LzAllocationDetail>
    		<LzAllocationDetail>
    			<LzAccountId>Fund1</LzAccountId>
    			<LzQuantity>700</LzQuantity>
    			<LzStrategy>Strat3</LzStrategy>
    		</LzAllocationDetail>
    		<LzAllocationDetail>
    			<LzAccountId>Fund1</LzAccountId>
    			<LzQuantity>800</LzQuantity>
    			<LzStrategy>Strat4</LzStrategy>
    		</LzAllocationDetail>
    	</LzOmnibus>
    	<LzOmnibus>
    		<LzAllocationDetail>
    			<LzAccountId>Fund1</LzAccountId>
    			<LzQuantity>700</LzQuantity>
    			<LzStrategy>Strat3</LzStrategy>
    		</LzAllocationDetail>
    		<LzAllocationDetail>
    			<LzAccountId>Fund1</LzAccountId>
    			<LzQuantity>800</LzQuantity>
    			<LzStrategy>Strat4</LzStrategy>
    		</LzAllocationDetail>
    	</LzOmnibus>
    </LzMessage>
    Grosso modo je veux, sous chaque Omnibus regrouper les allocationDetails par rapport au AccountId.
    J'ai donc utilisé le xsl suivant :

    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    	<xsl:key name="regrouper" match="LzAccountId" use="."/>
    	<xsl:template match="/">
    		<LzMessage>
    				<xsl:apply-templates select="LzMessage/LzOmnibus"/>
    		</LzMessage>
    	</xsl:template>
    	<xsl:template match="LzOmnibus">
    			<LzOmnibus>
    				<xsl:apply-templates select="LzAllocationDetail/LzAccountId[generate-id(.)=generate-id(key('regrouper',.)[1])]"/>
    			</LzOmnibus>			
    	</xsl:template>
    	<xsl:template match="LzAccountId">
    		<LzAllocationDetail>
    			<xsl:copy-of select="."/>
    			<LzQuantity>
    				<xsl:value-of select="sum(//LzQuantity[../LzAccountId=current()])"></xsl:value-of>
    			</LzQuantity>
    			<LzStrategy>
    			<xsl:for-each select="//LzStrategy[../LzAccountId=current()]"><xsl:value-of select="."/>;<xsl:value-of select="../LzQuantity/."/>
    			<xsl:choose>
    				<xsl:when test="position()!=last()"><xsl:text> </xsl:text></xsl:when>
    			</xsl:choose></xsl:for-each>
    			</LzStrategy>
    		</LzAllocationDetail>
    	</xsl:template>
    </xsl:stylesheet>
    Le résultat est le suivant :
    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <LzMessage>
    	<LzOmnibus>
    		<LzAllocationDetail>
    			<LzAccountId>Fund1</LzAccountId>
    			<LzQuantity>3500</LzQuantity>
    			<LzStrategy>Strat1;500 Strat3;700 Strat4;800 Strat3;700 Strat4;800</LzStrategy>
    		</LzAllocationDetail>
    		<LzAllocationDetail>
    			<LzAccountId>Fund2</LzAccountId>
    			<LzQuantity>600</LzQuantity>
    			<LzStrategy>Strat2;600</LzStrategy>
    		</LzAllocationDetail>
    	</LzOmnibus>
    	<LzOmnibus/>
    </LzMessage>
    Comme vous le voyez, tout a été ramené sous le premier omnibus, ce que je ne souhaite pas ...
    Ou ais-je fauté ?
    Merci par avance et une biere a celui qui m'éclaire

  2. #2
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    c'est dû à l'usage de // pour sélectionner les LzQuantity. // étant le raccourci pour /descendant-or-self::*/, ce sont tous les LzQuantity du document qui sont passés en revue et non pas seulement ceux du LzOmnibus courant, comme ce devrait être le cas.

    Pour la bière, avec cette chaleur, ce sera une Blanche bien fraîche avec une rondelle de citron.

  3. #3
    Candidat au Club
    Inscrit en
    Avril 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup ! Ca marche nickel maintenant
    A charge de revanche

  4. #4
    Candidat au Club
    Inscrit en
    Avril 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Ben en fait je pensais que ca allait mais j'ai toujours un probleme...
    Par quoi dois-je remplacer mes // pour ne récupérer que les AccountId de mon noeud omnibus courant ?
    Désolé, je début en xsl

  5. #5
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Il y a plusieurs possibilités, l'une d'entre elles consiste à remonter jusqu'au LzOmnibus du LzAccountId puis de sélectionner ses descendants. Ce qui donne, pour la quantité totale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <LzQuantity>
      <xsl:value-of select="sum(ancestor::LzOmnibus/LzAllocationDetail/LzQuantity[../LzAccountId=current()])"></xsl:value-of>
    </LzQuantity>

Discussions similaires

  1. [XSLT]Regroupement par attribut.
    Par zserdtfg dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 08/12/2006, 11h35
  2. [XSLT] regrouper des noeuds identiques
    Par DelphLaga dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 14/11/2006, 17h07
  3. [XSLT] Regrouper les noeuds qui se ressemblent
    Par yos dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 19/10/2006, 16h51
  4. [XSLT] Regroupement ds XML
    Par Virginie dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 19/10/2006, 12h35
  5. [XSLT] Regroupement en utilsant xsl:key
    Par AVRAVR dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 28/07/2006, 10h02

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