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 :

Trier selon présence noeud


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 118
    Par défaut Trier selon présence noeud
    Bonjour à tous, je ne parviens pas à effectuer un tri un peu particulier en XSL : trier les element en fonction du nom d'une balise XML.

    Prenons par exemple le 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
    <racine>
    	<elementA>
    		<nom>Nom1</nom>
    		<modification>
    			blablabla
    		</modification>
    	</elementA>
    	<elementA>
    		<nom>Nom2</nom>
    		<suppression>
    			blablabla
    		</suppression>
    	</elementA>
    	<elementA>
    		<nom>Nom3</nom>
    		<modification>
    			blablabla
    		</modification>
    	</elementA>
    	<elementB>
    		<nom>Nom4</nom>
    		<suppression>
    			blablabla
    		</suppression>
    	</elementB>
    	<elementB>
    		<nom>Nom5</nom>
    		<modification>
    			blablabla
    		</modification>
    	</elementB>
    </racine>
    Je souhaiterais trier les "element" en ayant d'abord tous ceux contenant un nœud "modification", puis tous ceux ayant un nœud "suppression".
    Le tout fait partie d'un tri multiple au sein d'un for-each :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:for-each select="//elementA | //elementB">
    	<xsl:sort select="?"/>	<!-- ici trier par modification/suppression -->
    	<xsl:sort select="?"/>	<!-- ici trier par type d'element (A ou B) -->
    	<!-- autres tris ensuite -->
    </xsl:for-each>
    Je tâtonne un peu mais rien de probant n'en sort, des idées ?

  2. #2
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    Ceci, par exemple :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <xsl:sort select="count(modification)" data-type="number" order="descending" />
    <xsl:sort select="count(suppression)" data-type="number" order="descending" />
    ou des variations qui se différencient par des besoins un peu plus délicat mais pas exactement les mêmes.

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Hello,

    En XSLT 1.0 ce n'est pas évident.

    Pour le premier critère il est envisageable d'utiliser count(), qui renverra 0 en cas d'absence et 1 si l'élément est là.

    Pour le second critère tu peux simplement trier sur name() si l'ordre alphabétique des noms des éléments te convient.

    Ça donne un bricolage de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <xsl:sort select="count(modification)" order="descending"/>
    <xsl:sort select="name()"/>
    Mais si tu veux un contrôle plus raffiné, il va devenir plus simple de juste :
    - Traiter d'abord les elementA de modification
    - Puis les elementB de modification
    - Puis les elementA de suppression
    - Puis les elementB de suppression

    Si jamais tu commences à avoir plus de cas à traiter et que ça fait une explosion combinatoire, on peut imaginer des trucs plus élaborés.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 118
    Par défaut
    Merci pour vos réponses

    @Tsuji : bonne idée, le count(). Ca marche mieux que mon bricolage à base de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:sort select="*[local-name()]" />
    @thelvin : Merci pour tes remarques, je vais en tenir compte. En fait, le script est déjà un peu complexe, j'ai transposé uniquement mon problème dans l'exemple mais il y a déjà plusieurs appels du for-each pour gérer un tri sur numéro de département (il faut tenir compte de la séquence ...,19,2A,2B,21,...)

    Ce n'est pas encore opérationnel mais grâce à vous, j'ai de bonnes pistes

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

Discussions similaires

  1. Trier selon une variable?
    Par flear dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 14/06/2007, 10h00
  2. Trier selon la date
    Par Michaël dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 15/08/2006, 12h27
  3. Réponses: 6
    Dernier message: 17/01/2006, 09h12
  4. [debutant][JTable] Trier selon une colonne
    Par yupa dans le forum Composants
    Réponses: 3
    Dernier message: 08/08/2005, 11h05
  5. [XML] Parser selon des noeuds enfants
    Par GLDavid dans le forum Modules
    Réponses: 5
    Dernier message: 20/08/2004, 20h42

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