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] Arbres intermédiaires avec xsl:sort ? [Sources]


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut [XSL] Arbres intermédiaires avec xsl:sort ?
    Bonsoir,

    Je sort des éléments triés. En pratique, la donnée utilisée pour trier n'est pas constituée que de valeurs uniques, genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    PARIS Didier
    LYON Robert
    MARSEILLE Bernard
    LYON Berthe.
    etc.
    Je trierai par ville. Et j'aimerais ajouter un entête avant chaque ville. J'ai donc penser à intégrer un xsl:if. Mais je ne trouve pas le moyen de comparer l'élément actuel avec le précédent une fois qu'on travaille sur une liste triée.

    Comment faire ?


    Blustuff.

  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,

    il s'agit d'un problème classique, que l'on résoud en combinant un regroupement (avec la méthode Muench) et des tris. Si on suppose que ta source XML a cette structure :
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <test>
    	<client>
          <ville>PARIS</ville>
          <nom>Robert</nom>
       </client>  
    	<client>
          <ville>LYON</ville>
          <nom>Josette</nom>
       </client>  
    	<client>
          <ville>PARIS</ville>
          <nom>Didier</nom>
       </client>  
    	<client>
          <ville>MARSEILLE</ville>
          <nom>Aurélie</nom>
       </client>  
    	<client>
          <ville>BORDEAUX</ville>
          <nom>Robert</nom>
       </client>  
    	<client>
          <ville>MARSEILLE</ville>
          <nom>Zoé</nom>
       </client>  
    	<client>
          <ville>PARIS</ville>
          <nom>Tatiana</nom>
       </client>  
    	<client>
          <ville>LYON</ville>
          <nom>Béatrice</nom>
       </client>  
    	<client>
          <ville>MARSEILLE</ville>
          <nom>Alain</nom>
       </client>  
    </test>
    Le code XSLT qui te permettra de trier d'abord par ville en les regroupant, puis par nom sera celui-ci :
    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"?>
    <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="clients" match="client" use="ville"/>
    	<xsl:template match="test">
    		<resultat>
    			<xsl:for-each select="client[generate-id(.) = generate-id(key('clients', ville)[1])]">
    				<xsl:sort select="ville" order="ascending"/>
    				<!-- Place ton entête ici -->
    				<xsl:for-each select="/test/client[ville = current()/ville]">
    					<xsl:sort select="nom" order="ascending"/>
    					<xsl:copy-of select="."/>
    				</xsl:for-each>
    			</xsl:for-each>
    		</resultat>
    	</xsl:template>
    </xsl:stylesheet>
    Le principe est simple :
    - On sélectionne chaque élément <client> contenant un nom de ville qui apparaît pour la première fois dans le source XML ; on fait une itération sur chacun de ces éléments (le premier for-each)
    - On trie ces éléments par nom de ville
    - On sélectionne tous les éléments <client> dont la ville est la même que celle de l'élément <client> courant ; on fait une itération sur chacun de ces éléments (le deuxième for-each)
    - On trie ces éléments par nom de client

    Le résultat est celui-ci :
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <resultat>
    	<client>
    		<ville>BORDEAUX</ville>
    		<nom>Robert</nom>
    	</client>
    	<client>
    		<ville>LYON</ville>
    		<nom>Béatrice</nom>
    	</client>
    	<client>
    		<ville>LYON</ville>
    		<nom>Josette</nom>
    	</client>
    	<client>
    		<ville>MARSEILLE</ville>
    		<nom>Alain</nom>
    	</client>
    	<client>
    		<ville>MARSEILLE</ville>
    		<nom>Aurélie</nom>
    	</client>
    	<client>
    		<ville>MARSEILLE</ville>
    		<nom>Zoé</nom>
    	</client>
    	<client>
    		<ville>PARIS</ville>
    		<nom>Didier</nom>
    	</client>
    	<client>
    		<ville>PARIS</ville>
    		<nom>Robert</nom>
    	</client>
    	<client>
    		<ville>PARIS</ville>
    		<nom>Tatiana</nom>
    	</client>
    </resultat>

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Ok, merci beaucoup. Je ne connaissais pas autant d'opérateurs. Mais maintenant, je remarque qu'il est dommage dans votre construction dans le second wsl:for-each :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:for-each select="/test/client[ville = current()/ville]">
    vous utilisiez un tel test, alors que l'on peut utiliser l'opérateur key :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:for-each select="key('clients', ville)">
    Ce n'est pas plus rapide et plus pratique ? Je parle de rapidité parce que ma page commence à prendre du temps à être générée maintenant : /

  4. #4
    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
    Citation Envoyé par Blustuff
    Ok, merci beaucoup. Je ne connaissais pas autant d'opérateurs. Mais maintenant, je remarque qu'il est dommage dans votre construction dans le second wsl:for-each :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:for-each select="/test/client[ville = current()/ville]">
    vous utilisiez un tel test, alors que l'on peut utiliser l'opérateur key :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:for-each select="key('clients', ville)">
    Ce n'est pas plus rapide et plus pratique ? Je parle de rapidité parce que ma page commence à prendre du temps à être générée maintenant : /
    Bien vu !
    Ce sera effectivement plus rapide.

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

Discussions similaires

  1. [XSLT] tri par date avec xsl:sort
    Par Tanebisse dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 15/04/2010, 16h06
  2. Tri complexe avec xsl:sort
    Par jesemeatoutvent dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 17/01/2009, 21h53
  3. Réponses: 2
    Dernier message: 27/09/2007, 14h04
  4. probleme de tri avec xsl:sort
    Par d4v1d dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 07/06/2007, 15h35
  5. [XSL] Application d'un XSL pour produire un XSL... help
    Par Greedo dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 22/05/2003, 11h30

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