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 :

Créer une arborescence avec XSL


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 169
    Points : 40
    Points
    40
    Par défaut Créer une arborescence avec XSL
    Bonjour!

    Voila, j'ai un fichier XML que je dois mettre en forme avec un treeview...
    Bon ce fichier possède déja une certaine arborescence avec des noeuds parents et fils mais je dois en creér d'autres.
    Je m'explique par un exemple:

    Mon fichier XML a une arborescence de ce type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <a>
                   <b>
                         <c id=S></c>
                         <c id=SW></c>
                         <c id=SWDV></c>
                         <c id=SWDV01></c>
                         <c id=SWDV01AA></c>
                         <c id=SWDV01AA00></c>
                         <c id=SWDV01AA00AA></c>
                         <c id=SWDV01AB></c>
                         ....
                   </b>
             </a>
    En fait, toutes les balises <c> sont sur le même niveau hors mon treeview doit en fait créer un nouveau fils à chaque fois que l'id de la balise <c> descend dans l'arborcence par rapport au précédent.

    Ainsi, j'aimerais obtenir quelque chose comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ]<a>
                   <b>
                       <c id=S></c>
                             <c id=SW></c>
                                   <c id=SWDV></c>
                                        <c id=SWDV01></c>
                                             <c id=SWDV01AA></c>
                                                  <c id=SWDV01AA00></c>
                                                       <c id=SWDV01AA00AA></c>
                                                       <c id=SWDV01AA00AA></c>
                         ....
                   </b>
             </a>
    On voit bien que les 2 dernières balise sont au même niveau notamment.

    Donc je ne veux pas modifier mon fichier XML pour qu'il soit comme ça mais par son affichage en treeview via XSL, le présenter comme ça (avec des + et des - pour déplier et replier l'arbo) et j'avoue ne pas savoir comment m'y prendre...Est-ce que vous avez des idées pour moi sachant qu'au besoin je peux vou montrer le code que j'ai déja fait et qui me permet d'avoir mon affichage mais sans cette fameuse arborescence!

    Merci d'avance pour vos réponses et bonne journée!

  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,

    tu nous parles de TreeView, mais en quoi doit-il être fait ? En HTML, en VB, en Java... ?
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 169
    Points : 40
    Points
    40
    Par défaut
    Euh bah en XSL justement...lol
    J'utilise XSL pour tirer les infos que je veux de mon XML et je met de l'HTML pour faire un tableau qui me sert pour mon treeview avec du Javascript pour déplier/replier les noeuds...

  4. #4
    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 : 47
    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
    est ce que tes id ont une longueur maximale ou non, j'ia deja fait ce type d'algo mais pour des nombres bornés

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 169
    Points : 40
    Points
    40
    Par défaut
    Hum, en théorie je dirais que non car on peut tjs descendre d'un niveau apparement mais pour être sur je vais redemander à la personne qui saura me le dire avec certitude et je vous redis ça!

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 169
    Points : 40
    Points
    40
    Par défaut
    Ah bah ça va peut-être m'arranger ça, en fait l'id ont une longueur maximale: 18 car, a longueur minimale étant ben sur 1 car. Par exemple, ça donne ça au dernier niveau: "SWDV01AB00AA00AA0W"

  7. #7
    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 : 47
    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
    deuxieme question est qu'on peut avoir un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <a>
                   <b>
                         <c id=S></c>
                         <c id=SWD></c>
                         <c id=SWD></c>                   
                         <c id=S0></c>
                         <c id=S01></c>
                    </b>
    </a>
    SWD S0 meme niveau
    ou est ce qu'on est obligé la d'avoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <a>
                   <b>
                         <c id=S></c>
                         <c id=SW></c>
                         <c id=SWD></c>
                         <c id=SWD></c>                   
                         <c id=S0></c>
                         <c id=S01></c>
                    </b>
    </a>

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 169
    Points : 40
    Points
    40
    Par défaut
    Excuse moi mais je ne comprends pas trop ta question en fait...En fait, on peut avoir des SW... au même niveau oui, par exemple
    SWDV01AA00AA et SWDV01AA00AB seront au même niveau... a moins que ça ne soit pas sur ça ta question...

  9. #9
    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 : 47
    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
    dans ton arborescence pour le premier cas tu auras au meme niveau des elements de longueur 3 et 2 parce que ceux de longueur 3 n'ont pas de pere de niveau 2.
    Donc est ce qu'un noeud peut avoir des fils de longueur différente ou non

    d'apres tes exemple un noeud longuer n peut avoir des fils longueur n+1 ou n+2 mais on ne sait pas si le ou est exclusif ou inclusif

    trop bossé sur ces c*******ies je finis par considerer ca comme allant de soi

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 169
    Points : 40
    Points
    40
    Par défaut
    Hum oui c'est pas simple...
    Bon en fait j'ai pu récupérer la structure de ce fameux id: "11222222211"
    Donc voila, chaque chiffre correspond à un niveau d'arborescence et défini sur combien de chiffre le niveau est codé. Ainsi, on a bien

    S 1
    SW 1
    SWDV 2
    SWDV01 2
    etc...

    Donc on peut en déduire que les fils directs d'un père donné sont soit à n+1 soit à n+2 exclusivement...je sais pas pourquoi mais je sens que ça va être dur!

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 169
    Points : 40
    Points
    40
    Par défaut
    N'y aurait-il pas moyen de faire un algo ou l'on comparerait la longueur de l'id suivant avec celle du précédent et si la longueur est différente, alors on passe au niveau du dessous? Le faire dans un langage de prog classique me semble simple mais la en XSL, je ne sais même pas si c'est réalisable!

  12. #12
    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 : 47
    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
    Citation Envoyé par kobe
    Le faire dans un langage de prog classique me semble simple mais la en XSL, je ne sais même pas si c'est réalisable!
    aucun pb, le pb de l'algo porte sur le point que je te demande mais que tu n'as pas encore résolu (enfin peut être que si si c'est juste l'identifaint qui a partir d'un certain niveau prend 2 au lieu de 1 pas de pb mais.... )

    un algo tres court qui fait le cas 2
    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
    <?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="long" match="c" use="string-length(@id)"/>
    	<xsl:template match="/">
    		<b>
    			<xsl:apply-templates select="key('long',1)">
    				<xsl:with-param name="len" select="2"/>
    			</xsl:apply-templates>
    		</b>
    	</xsl:template>
    	<xsl:template match="c">
    		<xsl:param name="len"/>
    		<xsl:copy>
    			<xsl:attribute name="id"><xsl:value-of select="@id"/></xsl:attribute>
    			<xsl:choose>
    				<xsl:when test="key('long',$len)[starts-with(./@id,current()/@id)]">
    					<xsl:apply-templates select="key('long',$len)[starts-with(./@id,current()/@id)]">
    						<xsl:with-param name="len" select="$len + 1"/>
    					</xsl:apply-templates>
    				</xsl:when>
    				<xsl:otherwise>
    					<xsl:apply-templates select="key('long',($len+1))[starts-with(./@id,current()/@id)]">
    						<xsl:with-param name="len" select="$len + 2"/>
    					</xsl:apply-templates>
    				</xsl:otherwise>
    			</xsl:choose>
    		</xsl:copy>
    	</xsl:template>
    </xsl:stylesheet>

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 169
    Points : 40
    Points
    40
    Par défaut
    Heu, je n'ai pas répondu à ta question? Pourtant, j'ai bien dis que pour un père donné, il a soit uniquement des fils à n+1 car soit uniquement des fils à n+2 car... C'est ce qu'explique le "11222222211" non? Par exemple le 1er niveau ne peut avoir que des fils qui sont sur 1 seul car de plus que lui, et qui seront donc au 2ème niveau, tout comme le niveau 3 qui lui passe forcément à 4 car...ou alors je comprends vraiment rien du tout à ta question! mdr

  14. #14
    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 : 47
    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
    Citation Envoyé par kobe
    Heu, je n'ai pas répondu à ta question? Pourtant, j'ai bien dis que pour un père donné, il a soit uniquement des fils à n+1 car soit uniquement des fils à n+2 car... C'est ce qu'explique le "11222222211" non? Par exemple le 1er niveau ne peut avoir que des fils qui sont sur 1 seul car de plus que lui, et qui seront donc au 2ème niveau, tout comme le niveau 3 qui lui passe forcément à 4 car...ou alors je comprends vraiment rien du tout à ta question! mdr
    Les regles d'arborescence c'est toujours un pied
    Test le code mais ca devrait marche dans ce cas

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 169
    Points : 40
    Points
    40
    Par défaut
    Excuse moi d'abuser de ta bonté et patience mais j'avoue que je ne comprends pas le fonctionnement de ce code...qu'est-ce qu'il est censé produire au juste? j'suis vraiment dsl mais quand je l'essaye avec un XML tout simple, il ne se passe rien, c'est normal? Pourrais-tu m'éclairer un peu?

  16. #16
    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 : 47
    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


    entree
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?xml version="1.0" encoding="UTF-8"?>
    <a>
    	<b>
    		<c id="S"/>
    		<c id="SWD"/>
    		<c id="SWD"/>
    		<c id="SW"/>
    		<c id="S0"/>
    		<c id="S01"/>
    	</b>
    </a>
    sortie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?xml version="1.0" encoding="UTF-8"?>
    <b>
    	<c id="S">
    		<c id="SW">
    			<c id="SWD" />
    			<c id="SWD" />
    		</c>
    		<c id="S0">
    			<c id="S01" />
    		</c>
    	</c>
    </b>
    apres à toi d'adapter l'algo pour faire une arbo html xml xsl .... mais tu a l'ordre de parsage

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 169
    Points : 40
    Points
    40
    Par défaut
    Arf, oui je vois mais en fait j'ai jamais utilisé XSL dans ce sens la...la si je comprends bien, j'obtiens un nouveau fichier XML mais par rapport à mon treeview, je dois mettre les règles dans le même fichier ou pas?

    En fait mon XSL à l'heure actuelle me permet de parcourir l'arbo de départ et de réaliser un treeview qui me va sauf que l'arbo de départ n'est pas bonne...

    Tu vas dire que j'abuses un peu et ça me gène mais je suis perdu

  18. #18
    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 : 47
    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
    Citation Envoyé par kobe
    je dois mettre les règles dans le même fichier ou pas?

    En fait mon XSL à l'heure actuelle me permet de parcourir l'arbo de départ et de réaliser un treeview qui me va sauf que l'arbo de départ n'est pas bonne...
    Le seul pb en xslt c'est le parcours.Si le resultat ne te plait pas , dans 99% des cas c'est parce que le parcours est mauvais. le parcours respectant les règles de ton arbre c'est ça
    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
    <?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="long" match="c" use="string-length(@id)"/>
    	<xsl:template match="/">
     
     
    	<xsl:apply-templates select="key('long',1)">
    				<xsl:with-param name="len" select="2"/>
    			</xsl:apply-templates>
     
    	</xsl:template>
    	<xsl:template match="c">
    		<xsl:param name="len"/>
     
    			<xsl:choose>
    				<xsl:when test="key('long',$len)[starts-with(./@id,current()/@id)]">
    					<xsl:apply-templates select="key('long',$len)[starts-with(./@id,current()/@id)]">
    						<xsl:with-param name="len" select="$len + 1"/>
    					</xsl:apply-templates>
    				</xsl:when>
    				<xsl:otherwise>
    					<xsl:apply-templates select="key('long',($len+1))[starts-with(./@id,current()/@id)]">
    						<xsl:with-param name="len" select="$len + 2"/>
    					</xsl:apply-templates>
    				</xsl:otherwise>
    			</xsl:choose>
     
    	</xsl:template>
    </xsl:stylesheet>
    Citation Envoyé par kobe
    Tu vas dire que j'abuses un peu et ça me gène mais je suis perdu
    Moi je ne comprends rien à ce que tu demandes

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 169
    Points : 40
    Points
    40
    Par défaut
    Erf, bon en fait c'est pas grave parce que j'ai une autre méthode qui semble plus simple mais j'vais avoir besoin d'un peu d'aide encore une fois je pense...

    En fait, j'ai réussi à mettre dans mon fichier XML à chaque balise <c> un attribut "indent" qui a une valeur de lettre de l'alphabet, A représentant donc le 1er niveau, et la dernière lettre étant la 18ème de l'alphabet (j'ai pu faire ça car l'information était disponible dans la base de données dont est extrait le fichier XML pour info)

    De ce fait, je pensais à une méthode qui parcourerait l'ensemble des balises <c> et qui compare l'attribut "indent" de la ligne actuelle avec la ligne précédente par exemple...si la lettre est plus haute, alors, j'indente, si c la même je la met à la même hauteur, si elle est plus basse, je l'indente moins...

    Seul souci, comment comparer l'élement courant avec l'élement précédent ou suivant dans un for each?

    Qu'est-ce que tu en penses? Ca conviendrai comme algo?

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 169
    Points : 40
    Points
    40
    Par défaut
    Bon, j'essaye d'avancer mais c'est pas simple...

    Est-ce qu'il existe une fonction permettant de convertir un string en int, pour pouvoir défnir un coefficient d'indentation pour chaque lettre et donc chaque niveau?

    J'suis vraiment pas sur que je m'embarque dans la bonne voie parce que ça me semble vraiment compliqué mais bon!

Discussions similaires

  1. Créer une arborescence de dossiers avec ls
    Par Celano dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 11/06/2015, 13h48
  2. [SP-2010] Créer une arborescence avec workflow sur Sharepoint 2010
    Par Unino dans le forum SharePoint
    Réponses: 4
    Dernier message: 18/08/2014, 10h08
  3. Créer une arborescence en XSL à partir d'un fichier XML
    Par maxou2009 dans le forum XML/XSL et SOAP
    Réponses: 23
    Dernier message: 27/09/2010, 13h35
  4. Réponses: 3
    Dernier message: 27/05/2009, 13h31
  5. créer une arborescence windows sous forme d'arbre java
    Par chupachoc dans le forum Composants
    Réponses: 3
    Dernier message: 01/10/2002, 16h48

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