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 :

[Débutant][XSLT] Regroupement


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 42
    Points : 26
    Points
    26
    Par défaut [Débutant][XSLT] Regroupement
    Bonjour, je sais que ce problème a été plusieurs fois traité, mais bien entendu je n'ai pas trouvé ce que je cherchais ou pas compris comment l'adapté
    Voici la partie du xml qui contient les données à traiter :

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    <sit_liste>
    <NOM>
    <![CDATA[ Le Relais
      ]]> 
      </NOM>
    <ADRPROD_LIBELLE_COMMUNE>
    <![CDATA[ Mortemart
      ]]> 
      </ADRPROD_LIBELLE_COMMUNE>
    <ADRPROD_CP>
    <![CDATA[ 87330
      ]]> 
      </ADRPROD_CP>
    <CRITERES>
      <Crit CLEF_CRITERE="30000072" CLEF_MODA="30000349" /> 
      </CRITERES>
      </sit_liste>
    <sit_liste>
    <NOM>
    <![CDATA[ Les Chtaigniers
      ]]> 
      </NOM>
    <ADRPROD_LIBELLE_COMMUNE>
    <![CDATA[ Bellac
      ]]> 
      </ADRPROD_LIBELLE_COMMUNE>
    <ADRPROD_CP>
    <![CDATA[ 87300
      ]]> 
      </ADRPROD_CP>
    <CRITERES>
      <Crit CLEF_CRITERE="30000072" CLEF_MODA="30000070" /> 
      </CRITERES>
      </sit_liste>
    <sit_liste>
    <NOM>
    <![CDATA[ Htel la Promenade
      ]]> 
      </NOM>
    <ADRPROD_LIBELLE_COMMUNE>
    <![CDATA[ Le Dorat
      ]]> 
      </ADRPROD_LIBELLE_COMMUNE>
    <ADRPROD_CP>
    <![CDATA[ 87210
      ]]> 
      </ADRPROD_CP>
    <CRITERES>
      <Crit CLEF_CRITERE="30000072" CLEF_MODA="30000069" /> 
      </CRITERES>
      </sit_liste>
    <sit_liste>
    <NOM>
    <![CDATA[ Auberge la  Source
      ]]> 
      </NOM>
    <ADRPROD_LIBELLE_COMMUNE>
    <![CDATA[ Cieux
      ]]> 
      </ADRPROD_LIBELLE_COMMUNE>
    <ADRPROD_CP>
    <![CDATA[ 87520
      ]]> 
      </ADRPROD_CP>
    <CRITERES>
      <Crit CLEF_CRITERE="30000072" CLEF_MODA="30000070" /> 
      </CRITERES>
      </sit_liste>
    <sit_liste>
    <NOM>
    <![CDATA[ Central Htel
      ]]> 
      </NOM>
    <ADRPROD_LIBELLE_COMMUNE>
    <![CDATA[ Bellac
      ]]> 
      </ADRPROD_LIBELLE_COMMUNE>
    <ADRPROD_CP>
    <![CDATA[ 87300
      ]]> 
      </ADRPROD_CP>
    </sit_liste>
    Ce que je veux obtenir c'est un regroupement par ADRPROD_LIBELLE_COMMUNE, ce n'est pas très compliqué et je peux l'obtenir en modifiant la requête sql qui génère le XML, mais ensuite, je veux que pour chaque ADRPROD_LIBELLE_COMMUNE, la ADRPROD_LIBELLE_COMMUNE soit écrite, et qu'ensuite soit repris NOM, ADRPROD_CP et ADRPROD_LIBELLE_COMMUNE.
    J'espère avoir été clair et que vous pourrez m'aider.
    Merci d'avance !

  2. #2
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mai 2007
    Messages : 262
    Points : 172
    Points
    172
    Par défaut
    Bonjour,

    Pourrait-on avoir un bout de ton XSL afin de voir où sont tes erreurs et pourquoi une petite maquette (vite faite) du résultat que tu souhaites obtenir.

    Merci

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 42
    Points : 26
    Points
    26
    Par défaut Voici le XSL
    Merci de ton intérêt.
    Donc voici le xsl :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <table width="100%" border="0">
    <xsl:for-each select="LEI/Resultat/sit_liste">
      <tr>
        <td width="21%"><xsl:value-of select="NOM" disable-output-escaping="yes"/></td>
        <td width="39%"><xsl:value-of select="ADRPROD_LIBELLE_COMMUNE" disable-output-escaping="yes"/></td>
        <td width="40%"><xsl:value-of select="ADRPROD_TEL" disable-output-escaping="yes"/></td>
      </tr>
     </xsl:for-each> 
    </table>
    Ce que je souhaite avoir en fait c'est :
    ADRPROD_LIBELLE_COMMUNE

    NOM
    ADRPROD_LIBELLE_COMMUNE
    ADRPROD_TEL

    et ça pour chaque NOM qui appartient à ADRPROD_LIBELLE_COMMUNE
    et bien entendu pour chaque ADRPROD_LIBELLE_COMMUNE.
    Je tiens à préciser que les ADRPROD_LIBELLE_COMMUNE sont classé par ordre alphabétiques dans la requête sql du xml.
    Merci d'avance.

    PS : J'ai tout à fait conscience que ce code est le minimal, mais je répète que je débute complètement.

  4. #4
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mai 2007
    Messages : 262
    Points : 172
    Points
    172
    Par défaut
    Bonjour,

    Pour pouvoir afficher tout ce que tu souhaites, il va falloir te servir des templates (fonction) qui vont te permettre d'afficher toutes les données de ton XML :

    Je t'explique :

    Tu va créer ton tableau puis tu commences ta boucle (ton début m'a l'air bien) ensuite tu va créer pour chaque balise XML une fonction qui va boucler dessus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <xsl:template match="NOM">
    <xsl:value-of select="."/>
    </xsl:template>
    Ce code te permet de récupérer toutes les valeurs de tes balises NOM.

    Il suffit simplement que tu adaptes ce code avec ton tableau.
    Pour appeler une fonction, on se sert de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <xsl:apply-templates select="NOM"/>
    Ton code est bon, il te suffit maintenant de remplacer tout simplement tes xsl:value-of par des appels de fonction que tu auras créées au préalable.

    Bon courage.

    (P.S : n'hésite pas à chercher des réponses dans la FAQ ou dans des tutoriels du site et tu trouveras facilement la réponse à ton problème !)

    Si tu as le moindre doute ou encore la moindre question n'hésite pas !

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 42
    Points : 26
    Points
    26
    Par défaut
    J'ai fait des recherches, j'ai essayé d'adapter du code, mais bon, ça marche pas

    Alors voici le code du xsl :

    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
     
    <body>
    <table width="100%" border="0">
    <xsl:key name="id" match="LEI/Resultat/sit_liste" use="."/>
    <xsl:template match="/">
    	<xsl:for-each select="ADRPROD_LABELLE_COMMUNE">
    	<xsl:variable name="groupe" select="."/>
    		<xsl:sort select="."/> 
    		<xsl:value-of select="."/>
    		<xsl:for-each select="NOM">
    			<xsl:if test="ADRPROD_LABELLE_COMMUNE=$groupe">
      <tr>
        <td width="21%"><xsl:value-of select="NOM" disable-output-escaping="yes"/></td>
        <td width="39%"><xsl:value-of select="ADRPROD_LIBELLE_COMMUNE" disable-output-escaping="yes"/></td>
        <td width="40%"><xsl:value-of select="ADRPROD_TEL" disable-output-escaping="yes"/></td>
      </tr>
      			</xsl:if>
      		</xsl:for-each>
     </xsl:for-each> 
     </xsl:template>
     </table>
     
    </body>
    L'idée, si j'ai bien compris, c'est de faire une première boucle sur chaque ADRPROD_LIBELLE_COMMUNE, de mettre le résultat dans une variable groupe, de refaire une boucle et pour chaque ADRPROD_LIBELLE_COMMUNE identique à la variable groupe, on affiche les données. Ca me semble simple et efficace, mais bon dans le code, ça bloque !
    Merci de m'aider.

  6. #6
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mai 2007
    Messages : 262
    Points : 172
    Points
    172
    Par défaut
    Slt,

    Tu as déjà une erreur de frappe (due au forum ou dans ton code) :

    => <xsl:for-each select="ADRPROD_LABELLE_COMMUNE">
    => <xsl:if test="ADRPROD_LABELLE_COMMUNE=$groupe">

    Remet les en place pour voir si ca marche déjà.

    Ensuite, il te suffit de créer une fonction qui boucle sur chaque "section" sit_liste.
    A l'intérieur de celle-ci, tu mettras le contenu de la "section" Adrprod_Libelle_Commune dans une variable.
    Tu testeras ensuite si la variable est égale à la valeur de cette section, si c'est le cas tu liste les valeurs nom et adrpod_CP sinon tu ne fais rien.

    C'est normal que ton code ne fonctionne pas car tu boucles sur ta balise Nom alors que tu devrais boucles sur tes balises sit_Liste puis Adrprod_Libelle_Commune.

    Ton raisonnement est bon mais ton code a quelques lacunes.

    Essaie de retravailler ca dis moi ou tu bloques ou si ca marche.
    N'hésites pas à me reposer des questions !!
    Bon courage

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 42
    Points : 26
    Points
    26
    Par défaut
    Merci pour la réponse, et c'est vrai qu'il y avait une faute de frappe

    Voici le code du xsl modifié, mais qui ne fonctionne toujours pas

    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
     
    <body>
    <table width="100%" border="0">
    <xsl:template match="LEI/Resultat">
    	<xsl:for-each select="/sit_liste">
    	<xsl:variable name="groupe" select="/ADRPROD_LIBELLE_COMMUNE"/>
    		<xsl:sort select="."/> 
    		<xsl:value-of select="."/>
    		<xsl:for-each select=".">
    			<xsl:if test="ADRPROD_LIBELLE_COMMUNE=$groupe">
      <tr>
        <td width="21%"><xsl:value-of select="NOM" disable-output-escaping="yes"/></td>
        <td width="39%"><xsl:value-of select="ADRPROD_LIBELLE_COMMUNE" disable-output-escaping="yes"/></td>
        <td width="40%"><xsl:value-of select="ADRPROD_TEL" disable-output-escaping="yes"/></td>
      </tr>
      			</xsl:if>
      		</xsl:for-each>
     </xsl:for-each> 
     </xsl:template>
     <xsl:apply-templates></xsl:apply-templates>
     </table>
     
    </body>
    Dans le template match j'ai pointé sur LEI/Resultat.
    Dans le premier for-each je pointe sur Sit_Liste.
    Déclaration de la variable groupe pointe sur ADRPROD_LIBELLE_COMMUNE
    Je mets la valeur de chaque ADRPROD_LIBELLE_COMMUNE dans groupe via value-of select="."
    Je boucle sur Sit_Liste via for-each select="." (puisque je suis déjà dessus dans la boucle précédente)
    Je teste si la valeur de ADRPROD_LIBELLE_COMMUNE est égal à groupe via if test="ADRPROD_LIBELLE_COMMUNE=$groupe
    et si oui j'affiche les données que je désire dans le tableau .
    Enfin je lance le template via <xsl:apply-templates></xsl:apply-templates>
    La logique me semble bonne, mais bien entendu, le codage pose encore des problème

  8. #8
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mai 2007
    Messages : 262
    Points : 172
    Points
    172
    Par défaut
    Tu as quoi comme résultat ???

    (as tu testé si ta variable correspondait bien à ce que tu voulais ??)

    OK je pense avoir vu ton erreur :

    Quand tu crées ton template, il s'agit d'une sorte de fonction.
    Tu peux donc en créer plusieurs.
    Or, dans ton cas tu en as créé une mais tu ne l'appelles nulle part...

    Pour l'appeler :
    <xsl:apply-templates select="LEI/Resultat"/>

    que tu places après ton table...

    A tester !
    Bon courage !

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 42
    Points : 26
    Points
    26
    Par défaut
    Ca avance je trouve
    En effet, ça boucle comme je veux.

    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
     
    			<body>
     
    					<xsl:for-each select="/sit_liste">
    						<xsl:variable name="groupe" select="/ADRPROD_LIBELLE_COMMUNE"/>
    						<xsl:value-of select="."/>
    						<xsl:for-each select=".">
    							<xsl:if test="ADRPROD_LIBELLE_COMMUNE=$groupe">
    								<tr>
    									<td width="21%">
    										<xsl:value-of select="NOM" disable-output-escaping="yes"/>
    									</td>
    									<td width="39%">
    										<xsl:value-of select="ADRPROD_LIBELLE_COMMUNE" disable-output-escaping="yes"/>
    									</td>
    									<td width="40%">
    										<xsl:value-of select="ADRPROD_TEL" disable-output-escaping="yes"/>
    									</td>
    								</tr>
    							</xsl:if>
    						</xsl:for-each>
    					</xsl:for-each>
     
    				<table width="100%" border="0">
    					<xsl:apply-templates select="LEI/Resultat"/>
    				</table>
    			</body>
    Mais il me manque juste des retours à la ligne dans le tableau car toutes les données sont sur une même ligne ???
    Et l'affichage de la valeur de ADRPROD_LIBELLE_COMMUNE dans une cellule lors de l'entrée dans le premier for-each car je veux le nom de la commune en tête de liste et que dans la liste encore une fois le nom de la commune.
    Merci de vos pistes !

  10. #10
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mai 2007
    Messages : 262
    Points : 172
    Points
    172
    Par défaut
    Et bien il te suffit de créer une varaible ou de récupérer $groupe qui te permettra d'afficher le nom voulu ou tu le souhaites.
    Pour avoir le nom de ta commune en titre, il te suffit de créer une nouvelle cellule.
    Et pour les retour à la ligne c'est pas <BR> ou <P> ???

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 42
    Points : 26
    Points
    26
    Par défaut
    Je suis d'accord sur les balise <br> et <p>. Mais comme je suis dans un tableau, ce que je voudrais, c'est créer une nouvelle ligne. Donc c'est pour ça que j'ai mis la balise <tr> au début de chaque if dans la deuxième boucle for-each et une balise </tr> juste avant d'en sortir. Je pensais qu'en entrant dans le if, cela créerait une nouvelle ligne du tableau.
    Quant à avoir le nom de la commune avant le listing de toutes les communes concernées je pensais qu'en mettant <xsl:value-of select="ADRPROD_LIBELLE_COMMUNE" disable-output-escaping="yes"/> juste dans la première boucle for-each cela fonctionnerait.
    Eh bien non, le nom de la commune n'apparait pas et les différentes lignes du tableau non plus. J'ai l'impression de ne plus rien comprendre au tableau depuis un certain temps !!!


    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
    39
     
    <body>
     
    					<xsl:for-each select="/sit_liste">
    						<xsl:variable name="groupe" select="/ADRPROD_LIBELLE_COMMUNE"/>
    						<xsl:value-of select="."/>
    						<tr><td>
    							<xsl:if test="ADRPROD_LIBELLE_COMMUNE">
    							<xsl:value-of select="ADRPROD_LIBELLE_COMMUNE" disable-output-escaping="yes"/>
    							</xsl:if>
    						</td></tr>
    						<xsl:for-each select=".">
    							<tr>
    							<xsl:if test="ADRPROD_LIBELLE_COMMUNE=$groupe">
    								<tr>
    									<td>
    										<xsl:if test="Nom">
    										<xsl:value-of select="NOM" disable-output-escaping="yes"/></xsl:if>
    									</td>
    								</tr><tr>
    									<td>
    										<xsl:if test="ADRPROD_LIBELLE_COMMUNE">
    										<xsl:value-of select="ADRPROD_LIBELLE_COMMUNE" disable-output-escaping="yes"/></xsl:if>
    									</td>
    								</tr><tr>
    									<td>
    										<xsl:if test="ADRPROD_TEL">
    										<xsl:value-of select="ADRPROD_TEL" disable-output-escaping="yes"/></xsl:if>
    									</td>
    								</tr><tr></tr>
    							</xsl:if>
    							</tr>
    						</xsl:for-each>
    					</xsl:for-each>
     
    				<table >
    					<xsl:apply-templates select="LEI/Resultat"/>
    				</table>
    			</body>

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 42
    Points : 26
    Points
    26
    Par défaut
    J'ai modifié, et simplifié me semble-t-il mon fichier xsl.
    J'ai récupéré un tableau

    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
     
    <body>
    	<xsl:for-each select="LEI/Resultat/sit_liste">
    	<xsl:variable name="groupe" select="/ADRPROD_LIBELLE_COMMUNE"/>
    	<xsl:value-of select="."/>
    	<table width="100%" border="2">
    	<xsl:for-each select=".">
    	<xsl:if test="ADRPROD_LIBELLE_COMMUNE=$groupe">	
      <tr>
        <td width="21%"><xsl:value-of select="NOM" disable-output-escaping="yes"/></td>
        <td width="39%"><xsl:value-of select="ADRPROD_LIBELLE_COMMUNE" disable-output-escaping="yes"/></td>
        <td width="40%"><xsl:value-of select="ADRPROD_TEL" disable-output-escaping="yes"/></td>
      </tr>
    	</xsl:if>
     
    	</xsl:for-each>
    	</table>
     
     </xsl:for-each> 
     
     
    </body>
    Maintenant il ne me reste plus qu'à afficher le nom de chaque commune en tête de chaque listing de nom correspondant à la commune et là, pour chaque essai que j'ai fait, ces noms sont en fin de tableau, et au lieu de l'avoir une fois, je l'ai autant de fois que de noms
    Mais ça avance !

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