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 :

fonctionnement xsl:key


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 16
    Par défaut fonctionnement xsl:key
    Bonjour à tous
    Je débute en XSLT et je ne sais pas comment obtenir ce que je veux.

    J'ai la structure suivante :

    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
    <Systeme>
    	<Document>
    		<Type>PRO</Type>
    		<Domaine>COM</Domaine>
    		<Famille>AEC</Famille>
    		<Libelle>Avis Echéance</Libelle>
    	</Document>
    	<Document>
    		<Type>BUR</Type>
    		<Domaine>COM</Domaine>
    		<Famille>DEV</Famille>
    		<Libelle>Offre commune</Libelle>
    	</Document>
    	<Document>
    		<Type>BUR</Type>
    		<Domaine>COM</Domaine>
    		<Famille>DEV</Famille>
    		<Libelle>Tarificateur MRE ACTE iard</Libelle>
    	</Document>
    Je cherche à regrouper les documents par domaine puis famille :
    Par domaine, j'y arrive comme cela :

    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
    <?xml version='1.0'?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:key name="domaine-gr" match="Document" use="Domaine" />  
    <xsl:template match="/">
    <html>
    <head>
    <LINK rel="stylesheet" type="text/css" href="tri.css"/>
    </head>
    <body>
    <ul class="niveau1">
    <xsl:for-each select="//Document[generate-id()= generate-id(key('domaine-gr',Domaine)[1])]">
    		<li> 
    			<xsl:value-of select="Domaine" />
    			<ul class="niveau2">   
    				<xsl:for-each select="key('domaine-gr',Domaine)">
    					<li> 
    						<xsl:value-of select="Famille" />
    						- <xsl:value-of select="Libelle" />
    					</li>
    				</xsl:for-each>
    			</ul>
    		</li>
    </xsl:for-each>
    </ul>
    </body>
    </html>
    </xsl:template>
    </xsl:stylesheet>
    Les class sont pour mon css utilisé pour la mise en forme.
    Avec ce XSLT, j'obtiens la liste de toutes les paires famille-libellé par domaine.
    Je voudrais maintenant regrouper ensuite chaque famille de domaine.

    au lieu d'avoir :
    COM
    - AEC - avis échéance
    - DEV - offre commune
    - DEV - Tarificateur


    Je voudrais :
    COM
    - AEC
    --- avis échéance
    - DEV
    --- offre commune
    --- Tarificateur


    Encore désolé pour la mise en page mais je n'ai pas réussi à faire mieux.
    Bonne journée à tous et merci d'avance.

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    Citation Envoyé par nicus88 Voir le message
    Encore désolé pour la mise en page mais je n'ai pas réussi à faire mieux.
    Balise CODE, le petit bouton en # dans la barre.

    Citation Envoyé par nicus88 Voir le message
    au lieu d'avoir :
    COM
    - AEC - avis échéance
    - DEV - offre commune
    - DEV - Tarificateur


    Je voudrais :
    COM
    - AEC
    --- avis échéance
    - DEV
    --- offre commune
    --- Tarificateur
    Il te faut deux regroupements, donc deux <xsl:key>.

    La première, celle que tu as déjà, pour regrouper par Domaine.

    La seconde, pour regrouper par Domaine+Famille.

    Par exemple, ça peut se faire comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:key name="famille-gr" match="Document" use="concat(Domaine, '/', Famille)" />
    J'ai mis un / pour séparer domaine et famille, mais tu peux construire ton use comme tu veux, du moment qu'il contient les deux informations.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 16
    Par défaut merci
    Merci beaucoup.

  4. #4
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 16
    Par défaut Utilisation seconde clé
    Voici mon code

    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'?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:key name="domaine-gr" match="Document" use="Domaine" />  
    <xsl:key name="famille-gr" match="Document" use="concat(Domaine, '/', Famille)" />
    <xsl:template match="/">
    <html>
    <head>
     
    </head>
    <body>
    <ul class="niveau1">
    <xsl:for-each select="//Document[generate-id()= generate-id(key('domaine-gr',Domaine)[1])]">
    		<li> 
    			<xsl:value-of select="Domaine" />
    			<ul class="niveau2">   
    				<xsl:for-each select="key('domaine-gr',Domaine)">
    					<xsl:for-each select="//Document[generate-id()= generate-id(key('famille-gr',concat(Domaine,'/',Famille))[1])]">
    						<li> 
    							<xsl:value-of select="Famille" />
    								<ul class="niveau3">   
    									<xsl:for-each select="key('famille-gr',concat(Domaine,'/',Famille))">
    										<li> 
    											<xsl:value-of select="Libelle" />
    										</li>
    									</xsl:for-each>
    								</ul>
    							<xsl:value-of select="Libelle" />
    						</li>
    					</xsl:for-each>
    				</xsl:for-each>
    			</ul>
    		</li>
    </xsl:for-each>
    </ul>
    </body>
    </html>
    </xsl:template>
    </xsl:stylesheet>
    Cela ne fonctionne pas comme je l'ai écrit.
    J'ai encore quelques progrès à faire.
    Pouvez-vous m'aidez svp.
    Merci d'avance.

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    Bon, il faut reconnaître que c'est pas évident.

    Il y a deux choses :

    # 1 - Deux for-each de suite sur le domaine choisi ? Intuitivement c'est pas logique... Et mathématiquement ça marche pas non plus.

    Le <xsl:for-each select="key('domaine-gr',Domaine)"> fait double emploi avec la boucle suivante.

    # 2 - Cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:for-each select="//Document[generate-id()= generate-id(key('famille-gr',concat(Domaine,'/',Famille))[1])]">
    va sélectionner toutes les combinaisons Domaine/Famille du document.
    Or, toi tu ne veux que les combinaisons qui commencent par le Domaine que tu viens de choisir.
    Par exemple, Dans la liste du COM, tu ne veux que toutes les combinaisons COM/Famille du document.

    Alors comment faire ça ? Avec une variable.
    - Faire <xsl:variable name="varDomaine" select="Domaine"/> au début de la boucle sur les domaines.

    - Remplacer Domaine par $varDomaine dans la suite.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 16
    Par défaut
    Merci d'avoir pris le tps de me répondre.

    Voici alors mon code :

    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
    </head>
    <body>
    <ul class="niveau1">
    <xsl:for-each select="//Document[generate-id()= generate-id(key('domaine-gr',Domaine)[1])]">
    		<li> 
    			<xsl:value-of select="Domaine" />
    			<ul class="niveau2">   
    				<xsl:for-each select="key('domaine-gr',Domaine)">
    				<xsl:variable name="varDomaine" select="Domaine"/>
    					<xsl:for-each select="//Document[generate-id()= generate-id(key('famille-gr',concat($varDomaine,'/',Famille))[1])]">
    						<li> 
    							<xsl:value-of select="Famille" />
    								<ul class="niveau3">   
    									<xsl:for-each select="key('famille-gr',concat($varDomaine, '/', Famille))">
    										<li> 
    											<xsl:value-of select="Libelle" />
    										</li>
    									</xsl:for-each>
    								</ul>
    						</li>
    					</xsl:for-each>
    				</xsl:for-each>
    			</ul>
    		</li>
    </xsl:for-each>
    </ul>
    </body>
    </html>
    </xsl:template>
    </xsl:stylesheet>
    Je me retrouve avec des doublons:
    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
    COM
     
        AEC
            Avis Echéance (version avant 1995)
        DEV
            Offre commune
            Tarificateur MRE ACTE iard
            Tarificateur PME PMI ACTE iard
        FIC
            Fiche client
        IMP
            Import commercial
        LEA
            Autorisation de prélèvement
            Lettre commissionnement (AE avant 1995)
        AEC
            Avis Echéance (version avant 1995)
        DEV
            Offre commune
            Tarificateur MRE ACTE iard
            Tarificateur PME PMI ACTE iard
        FIC
            Fiche client
        IMP
            Import commercial
        LEA
            Autorisation de prélèvement
            Lettre commissionnement (AE avant 1995)
        AEC
            Avis Echéance (version avant 1995)
        DEV
            Offre commune
    etc.......

    On recommence plusieurs fois à partir d'AEC...
    Que se passe t-il?
    Merci de votre aide

  7. #7
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 16
    Par défaut Résolu
    Ok autant pour moi cela fonctionne maintenant.
    merci encore

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

Discussions similaires

  1. Rassemblement des noeuds, maximum et xsl:key
    Par mlny84 dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 03/06/2008, 16h19
  2. [XSLT] Utilisation de xsl:key
    Par blupin dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 21/09/2007, 10h45
  3. [XSLT] peut on faire un select dans un xsl:key ?
    Par DelphLaga dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 13/10/2006, 13h06
  4. [XSLT] Regroupement en utilsant xsl:key
    Par AVRAVR dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 28/07/2006, 10h02
  5. [XSL] recherche infos sur xsl:key
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 17/02/2006, 17h23

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