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 dans un regroupement.


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Invité
    Invité(e)
    Par défaut [XSLT] regroupement dans un regroupement.
    Bonjour,

    Je souhaite effectué un 1er regroupement (celui la j'y arrive), puis ensuite un 2nd en plus du premier (et la ça bloque) pour au final afficher les titres trié pa LIEU puis par CAT

    voici un exemple de code XML sur lequel j'aimerais appliqué ce procédé :

    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
    <BIBLIO>
     
    	<LIVRES>
     
    		<LIVRE isbn="i_123" cat="NR">
    			<TITRE>Les fourmis</TITRE>
    			<AUTEUR>Bernard Werber</AUTEUR>
    			<EDITEUR>Albin Michel</EDITEUR>
    			<LIEU>ex_biblio1</LIEU>
    		</LIVRE>
     
    		<LIVRE isbn="i_762" cat="P">
    			<TITRE>Capitaine Hornblower</TITRE>
    			<AUTEUR>C.S Forester</AUTEUR>
    			<LIEU>ex_biblio2</LIEU>
    		</LIVRE>
     
    		<LIVRE isbn="i_521" cat="NR">
    			<TITRE>Hercule Poirot</TITRE>
    			<AUTEUR>Agatha CHRISTIE</AUTEUR>
    			<EDITEUR>Bodley Head</EDITEUR>
    			<LIEU>ex_biblio1</LIEU>
    		</LIVRE>

    et voici mon code XSLT pour le 1er regroupement (peut-être moche car c'est la 1ère fois que j'utilise la méthode muench...)

    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
    <xsl:key name="regrouperL" match="LIEU" use="."/>
     
        <xsl:template match="/BIBLIO">
         ...                    
                        <xsl:apply-templates select="LIVRES/LIVRE"/> 
         ...
        </xsl:template>
     
     
        <xsl:template match="LIVRE">
            <td>
                <xsl:apply-templates select="LIEU[generate-id(.)=generate-id(key('regrouperL',.)[1])]"/>
            </td>    
        </xsl:template>
     
     
        <xsl:template match="LIEU">
            <tr>
                <td>
                    <xsl:copy-of select="."/>
                </td>
                <td>
                    <xsl:apply-templates select="//LIVRE/TITRE[../LIEU = current()]"/>
                </td>
            </tr>
        </xsl:template>
     
     
        <xsl:template match="TITRE">      
        <li>
            <xsl:value-of select="."/>
        </li>
        </xsl:template>

    En sortie, j'ai un tableau avec 2 colonnes, 1 pour chaque lieu, et ls livres sont bien dans leur bonne colonne.
    Maintenant il me faut réitiré ce procédé sur le nouvelle arbre en triant par l'attribut "cat"...

    J'ai beau rééssayer d'appliqué Muench, j'obtiens un tableau vide à la fin...

    Merci pour vos remarques.

    PS: JE N'AI PAS LE DROIT AU FOR EACH POUR CETTE APPLICATION ^^

  2. #2
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    je ne suis pas sûr de comprendre ou vous voulez en venir

    Vous pourriez montrer le resultat que vous voulez obtenir ?

    une optimisation :
    plutot que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <xsl:apply-templates select="//LIVRE/TITRE[../LIEU = current()]"/>
    preferez
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <xsl:apply-templates select="key('regrouperL',current())/../TITRE"/>
    [

  3. #3
    Invité
    Invité(e)
    Par défaut
    j'aimerais un résultat, après mise en forme, du genre

    lieu1
    cat1
    livreA
    livreD
    cat2
    livreC
    livreZ

    lieu2
    cat1
    livreT
    cat2
    livreS
    livreR

  4. #4
    Invité
    Invité(e)
    Par défaut
    Je dois avancer légèrement

    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
        <xsl:key name="grpCategorie" match="@cat" use="." />
        <xsl:key name="grpSecteur" match="LIEU" use="." />
     
        <xsl:template match="/BIBLIO">
            <HTML>
                <head>
                    <META http-equiv="Content-Type" content="text/html ; charset=UTF-8"/>
                    <title>Bibliothèque</title>
                </head>
                    <xsl:apply-templates select="//@cat[generate-id()=generate-id(key('grpCategorie',.)[1])]"/>
            </HTML>
        </xsl:template>
     
        <xsl:template match="@cat">
            <xsl:variable name="categorie" select="."/>
            <h1>Categorie : <xsl:value-of select="$categorie"/></h1>
            <xsl:apply-templates select="//LIVRE[@cat=$categorie]/LIEU[generate-id()=generate-id(key('grpSecteur',.)[1])]"/>
        </xsl:template>
     
        <xsl:template match="LIEU">
            <xsl:variable name="lieux" select="."/>
            <h2>Lieu : <xsl:value-of select="$lieux"/></h2>
            <xsl:apply-templates select="//LIVRE[LIEU=$lieux]"/>
        </xsl:template>
    Je trouve mes catégories, les livres sont dans le bon lieu, mais pas dans la bonne catégorie, on dirait que des qu'il match un lieu, il prend tous les livres qui lui corresponde...

    Categorie : NR
    Lieu : ex_biblio1
    Les fourmis
    Hercule Poirot
    Categorie : C
    Lieu : ex_biblio2
    Capitaine Hornblower
    La Bible
    Number, the Language of Science
    Tales of Grandpa Cat
    Language and the Science of Number
    Evolution of Complexity in Animal Culture
    Patterns of Crime in Animal Culture
    When We Were Very Young
    Learn Java Now
    Design Patterns
    Categorie : S
    Categorie : F
    Categorie : P

  5. #5
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    oui vous vous rapprochez de la solution, j'ai fais ça à partir de votre exemple
    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
    <?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="regrouperL" match="LIEU" use="."/>
    	<xsl:key name="regrouperC" match="@cat" use="concat(../LIEU,.)"/>
    	<xsl:template match="/BIBLIO">
         ...                    
                        <xsl:apply-templates select="LIVRES/LIVRE"/> 
         ...
        </xsl:template>
    	<xsl:template match="LIVRE">
    		<table>
    			<xsl:apply-templates select="LIEU[generate-id(.)=generate-id(key('regrouperL',.)[1])]"/>
    		</table>
    	</xsl:template>
    	<xsl:template match="LIEU">
    		<tr>
    			<td>
    				<xsl:copy-of select="."/>
    			</td>
    			<td>
    				<xsl:apply-templates select="//@cat[generate-id(.)=generate-id(key('regrouperC',concat(current(),.))[1])]"/>
    			</td>
    		</tr>
    	</xsl:template>
    	<xsl:template match="@cat">
    		<xsl:value-of select="."/>
    		<xsl:apply-templates select="key('regrouperC',concat(../LIEU,current()))/../TITRE"/>
    	</xsl:template>
    	<xsl:template match="TITRE">
    		<li>
    			<xsl:value-of select="."/>
    		</li>
    	</xsl:template>
    </xsl:stylesheet>

  6. #6
    Invité
    Invité(e)
    Par défaut
    J'étais pas loin et j'ai réussi finalement, mais la tienne est plus optimale et plus courte que la mienne

    Merci beaucoup

  7. #7
    Invité
    Invité(e)
    Par défaut
    Hum, finalement, en m'attardant un peu plus sur votre réponse, j'ai compris la clé associé à LIEU, mais celle associé à CAT, du tout !

    Si vous pouviez me donner quelques explications sur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:key name="regrouperC" match="@cat" use="concat(../LIEU,.)"/>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:apply-templates select="key('regrouperC',concat(../LIEU,current()))/../TITRE"/>
    Merci d'avance

  8. #8
    Invité
    Invité(e)
    Par défaut
    Vraiment personne qui comprend ces 2 lignes de code ? (même si vous avez pas l'arbre XML sous les yeux ?)

  9. #9
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 567
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 635
    Points
    21 635
    Par défaut
    Je ne suis pas très à l'aise, mais de ce que j'en comprends :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:key name="regrouperC" match="@cat" use="concat(../LIEU,.)"/>
    La première groupe les attributs @cat du document par couple (nom-de-lieu,nom-de-categorie)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:apply-templates select="key('regrouperC',concat(../LIEU,current()))/../TITRE"/>
    Cela appelle le template de titre, pour tous les titres de livres qui ont la même catégorie et le même lieu que le nœud de l'attribut @cat considéré.

  10. #10
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    Oui c'est ça en effet

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

Discussions similaires

  1. Regroupement dans formulaire
    Par zut94 dans le forum Access
    Réponses: 4
    Dernier message: 15/03/2006, 17h45
  2. Réponses: 6
    Dernier message: 09/02/2006, 19h00
  3. Regroupement dans un etat
    Par David1974 dans le forum Access
    Réponses: 2
    Dernier message: 14/10/2005, 09h12
  4. Réponses: 4
    Dernier message: 26/05/2005, 17h46
  5. Problème de champs vierge dans un regroupement
    Par GrisburT dans le forum Oracle
    Réponses: 8
    Dernier message: 09/12/2004, 11h08

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