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 :

Tri avec recopie de l'arborescence [XSLT 1.0]


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 2
    Par défaut Tri avec recopie de l'arborescence
    Bonjour à tous et merci d'avance de lire ces quelques lignes.

    Donc voila depuis quelques jours je suis bloqué sur un script en xsl me permettant de trier des données xml. Voici mon xml :

    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
     
    <FILE NAME="toto">
     
    <bulk xmlns:subs="sum.xsd" xmlns="config.xsd" xmlns:xn="generic.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="config.xsd config.xsd">
    <config>
        <subs:Data>
            <subs:NID id="2">
                blabla
            </subs:NID>
            <subs:NID id="3">
                blibli
            </subs:NID>
            <subs:Ind id="1">
                bloblo
            </subs:Ind>
        </subs:Data>
    </config>
    </bulk>
    J'aimerais en fait rentrer dans l'arborescence jusqu'à subsata et ensuite trier tous les fils. En effet même si ceux-ci on des noms(élément) différents, ils ont tous en commun un attribut id. Actuellement après plusieurs essais je suis parvenu à comprendre le système d'espace de nom pour pouvoir descendre proprement dans l'arborescence, mais j'ai deux problèmes concernant le tri.

    J'ai utilisé deux méthodes pour pouvoir effectuer ce que je recherche :
    La première me permet de trier mes éléments proprement mais elle ne copie pas l'arborescence en entier juste l'élément courant et la nouvelle réorganisation.
    Xsl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <xsl:for-each select="conf:bulk/conf:config/subs:Data/*">
      <xsl:sort data-type="number" select="@id" order="ascending"/>			
      <xsl:copy-of select="."/>
    </xsl:for-each>
    Resultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <subs:Ind id="1">
         bloblo
    </subs:Ind>
    <subs:NID id="2">
         blabla
    </subs:NID>
    <subs:NID id="3">
         blibli
    </subs:NID>

    Le tri est donc bien effectué mais je n'ai pas de recopie de l'arborescence en entier.
    J'ai alors essayer de mettre cette ligne à la place de copy-of
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <xsl:copy-of select="../../../.."/>
    Mais comment je m'y attendais, cela a en fait recopier l'arborescence la plus haute en écrasant le tri. J'ai quand même l'arborescence que je recherche. Je voudrais savoir donc si il y a une méthode pour mixer les deux pour que j'obtienne 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
     
    <FILE NAME="toto">
     
    <bulk xmlns:subs="sum.xsd" xmlns="config.xsd" xmlns:xn="generic.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="config.xsd config.xsd">
    <config>
        <subs:Data>
            <subs:Ind id="1">
                bloblo
            </subs:Ind>
            <subs:NID id="2">
                blabla
            </subs:NID>
            <subs:NID id="3">
                blibli
            </subs:NID>
        </subs:Data>
    </config>
    </bulk>

    Merci d'avance d'avoir lu jusqu'ici . Je précise que je ne suis pas un dieu en xsl étant donné que j'ai commencé cela il y a 4-5 jours .

    Bonne journée

  2. #2
    Membre Expert
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Par défaut
    Le copy-of permet (à ma connaissance) de récupérer une sous-arborescence complète d'un élément à partir d'un chemin spécifié. Tu ne peux donc pas modifier la sous-arborescence obtenue.

    Dans ton cas le plus simple serait de recréer toi-même l'arborescence parente dans ta template :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <bulk xmlns:subs="sum.xsd" xmlns="config.xsd" xmlns:xn="generic.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="config.xsd config.xsd">
    <config>
        <subs:Data>
            <xsl:for-each select="conf:bulk/conf:config/subs:Data/*">
                <xsl:sort data-type="number" select="@id" order="ascending">			
                <xsl:copy-of select="."/>
            </xsl:for-each>
        </subs:Data>
    </config>
    </bulk>

  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
    Ou alors, ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <!-- template qui copie tous les nœuds tels que et applique les templates à leurs enfants -->
    <xsl:template match="node()|@*">
      <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
      </xsl:copy>
    </xsl:template>
     
    <xsl:template match="subs:Data">
      <xsl:copy>
        <xsl:for-each ... >
           <!-- mettre le tri comme avant -->
        </xsl:for-each>
      </xsl:copy>
    </xsl:template>
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Nouveau candidat au Club
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 2
    Par défaut
    J'ai essayer ce que tu m'as donner thelvin et sa marche niquel. J'avais commencer à regarder du coté des apply-template mais j'avais mal compris l'utilisation. Je ne voyais pas non plus l'intérêt de "copy" tout court sachant que sa ne copie pas les attributs mais avec cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <xsl:template match="node()|@*">
    	<xsl:copy>
    	<xsl:apply-templates select="node()|@*"/>
    	</xsl:copy>
    Si je comprend bien le template se re-appel lui même sur les éléments et sur les attributs donc il force la copie de ceux-ci dans l'élément.

    Merci à vous deux pour une meilleur compression de ce langage et de m'avoir aider si vite !

  5. #5
    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
    Citation Envoyé par pClarot Voir le message
    Si je comprend bien le template se re-appel lui même sur les éléments et sur les attributs donc il force la copie de ceux-ci dans l'élément.
    Yup. C'est effectivement pas super simple, mais il y a des cas où on n'a pas envie de copier tous les attributs, et la syntaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:element name="{name()}" uri="{namespace-uri()}">
    est un peu lourdingue par rapport à <xsl:copy/>
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. Problème de tri avec analyse croisée
    Par drthodt dans le forum Access
    Réponses: 2
    Dernier message: 18/10/2005, 16h23
  2. formule de calcul du TRI avec PL/SQL
    Par mongilotti dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 30/07/2005, 20h23
  3. Pb de tri avec champs vide
    Par Invité dans le forum Langage SQL
    Réponses: 2
    Dernier message: 01/06/2004, 17h42
  4. tri avec l'ordre UPDATE et incrementation d'une colonne
    Par Staron dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/02/2004, 08h48
  5. tri avec les champs vides en dernier
    Par r-zo dans le forum Requêtes
    Réponses: 11
    Dernier message: 03/09/2003, 13h40

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