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 :

[XSLT] balises entrelacées ?


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 95
    Points : 77
    Points
    77
    Par défaut [XSLT] balises entrelacées ?
    bonjour,

    seconde question de la matiné

    voila je voudrais ecrire un bout de script xslt de ce style là ...

    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
     
    <xsl:element name="balise1">
         <xsl:for-each select="root/element/*">
               <xsl:choose>
                   <xsl:when test=condition>
                         <xsl:element name="balise2">
                                  faire qqch
                          </xsl:element>
                    <xsl:when>
                    <xsl:otherwise>
    		      </xsl:element> => on ferme la balise1
                          <xsl:element name="balise1">  => on reouvre une balise 1
                          <xsl:element name="balise2">
                                  faire qqch
                          </xsl:element>
    		</xsl:otherwise>
    	     </xsl:choose>
             </xsl:for-each>
     </xsl:element> => on ferme la balise1
    biensur, j'ai deja essayé et ça marche pas .. il ne supporte pas que je referme la "balise1" dans la boucle ... quelqu'un à une idée ?

  2. #2
    Membre éprouvé Avatar de laurentibus
    Inscrit en
    Mars 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2008
    Messages : 875
    Points : 908
    Points
    908
    Par défaut
    oui alors effectivement

    pourquoi dans le cas " autres cas" aka otherwise tu commence par fermer une balise ???????????????????????????????????????? c'est marrant un peu mais c'est pas tip top : j aime bien mais j'aime pas trop quand meme

    alors je ne sais pas ce que tu veux faire mais il semblerait que dnas le cas "otherwise" tu veuilles construire deux balises, moi je ferais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    <xsl:otherwise>
     
                          <xsl:element name="balise1"> 
                            faire qqch 
                          </xsl:element> => on ferme la balise1
     
                          <xsl:element name="balise2">
                                  faire qqch
                          </xsl:element>
    		</xsl:otherwise>

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 95
    Points : 77
    Points
    77
    Par défaut
    parceque je veux obtenir une structure de ce type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <layout>
         <balise1>
             <balise2>truc</balise2>
             <balise2>machin</balise2>
             <balise2>chouette</balise2>
         </balise1>
          <balise1>
             <balise2>AAA</balise2>
         </balise1>
    </layout>
    c'est l'un des elements de "AAA" qui force la separation d'avec "truc machin chouette"

  4. #4
    Membre éprouvé Avatar de laurentibus
    Inscrit en
    Mars 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2008
    Messages : 875
    Points : 908
    Points
    908
    Par défaut
    ah c'est pas pareil

    alors dans ta balise1 il n y as pas d autre balise1 c'est a dire que des balise2
    tu ouvre et tu ferme qu une seule fois ta balise1 c'est mieux
    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
     
     
    <xsl:element name="balise1">
         <xsl:for-each select="root/element/*">
               <xsl:choose>
                   <xsl:when test=condition>
                         <xsl:element name="balise2">
                                  faire qqch
                          </xsl:element>
                    <xsl:when>
                    <xsl:otherwise>
                          <xsl:element name="balise2">
                                  faire qqch
                          </xsl:element>
    		</xsl:otherwise>
    	     </xsl:choose>
             </xsl:for-each>
     </xsl:element> => on ferme la balise1

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 95
    Points : 77
    Points
    77
    Par défaut
    OK , mais lorsque j'arrive dans le cas de "AAA", je doit fermer ma balise1 et la reouvrir afin d'ecrire le <balise2>AAA</balise2>

    imagine que tu ecrit des elements les un à la suite des autres (tu as une ligne de longueur infini) .... et il y en a quelques uns qui te force à changer de ligne avant de les ecrire ...

    mais tu ne le sait que lorsque tu les rencontres

  6. #6
    Membre éprouvé Avatar de laurentibus
    Inscrit en
    Mars 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2008
    Messages : 875
    Points : 908
    Points
    908
    Par défaut
    ah oui ok je vois ben faut que tu fasse un algo qui a mon avis va etre un peu
    donc en reflechissant un peu avec les molécules feignantissePowa de mon cerveau :
    je me suis dis : "tiens aujourd hui il fait vraiment un temps de chien .. mais c'est pas pour autant que 1 ne fais pas 1 + 1 "
    donc en gros tu t occupe des balises ( on va dire type1) d abord :
    <balise1>
    <balise2>truc</balise2>
    <balise2>machin</balise2>
    <balise2>chouette</balise2>
    </balise1>

    puis apres de celle ci :
    <balise1>
    <balise2>AAA</balise2>
    </balise1>


    je pense que l 'ordre dans lequel sont ecrites les balises n 'est pas important ....

    niveau 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
     
     
    xsl:element name="balise1">
         <xsl:for-each select="root/element/[ton test qui correspond au balise type1 ]">
    <xsl:element name="balise2">
                                  faire qqch
                          </xsl:element>
    </xsl:for-each>
     </xsl:element> => on ferme la balise1
     
     
    xsl:element name="balise1">
         <xsl:for-each select="root/element/[ton test qui correspond au balise type2 ]">
    <xsl:element name="balise2">
                                  faire qqch
                          </xsl:element>
    </xsl:for-each>
     </xsl:element> => on ferme la balise1
    apres si tu veux pas faire comme ca : tu peux toujours implementer un algo "en un coup " qui differencie et gere tout ... mais a mon avis ca va etre beaucoup plus chiant ;D

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 95
    Points : 77
    Points
    77
    Par défaut
    j'en ai marre de vouloir faire des truc infaisable ... pourquoi plus personne n'utilise le C ...

  8. #8
    Membre éprouvé Avatar de laurentibus
    Inscrit en
    Mars 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2008
    Messages : 875
    Points : 908
    Points
    908
    Par défaut
    c 'est pas infaisalbe ...
    si le fait que toute les balise2 de type1 soit tous dans la meme balise1
    et que les balise2 de type 2 soit aussi tous dans la meme balise1
    c'est a dire que tu n aurais que 2 balise1 .....
    he ben je ne vois point ou est le pb
    tu fais les deux boucle for each et .|

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 95
    Points : 77
    Points
    77
    Par défaut
    bah non justement, c'est lorsque tu tombe face à un element donné, tu ferme la balise1, tu en reouvre une autre et ensuite tu place ton element dedans (via balise2)

  10. #10
    Membre éprouvé Avatar de laurentibus
    Inscrit en
    Mars 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2008
    Messages : 875
    Points : 908
    Points
    908
    Par défaut
    si tu ne peux pas avoir tous les trucs, machin , chouette dans la meme balise1
    et tous les AAA dans une autre balise1

    ben faut que tu mette au point un algo pour effectuer le traitement que tu souhaite

    il faut que tu reflechise a comment tu vas te servir de ton fichier xml et si ma solution te pose un pb d interprétation après ?

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 95
    Points : 77
    Points
    77
    Par défaut
    a comment tu vas te servir de ton fichier xml
    si seulement je savait comment fonctionne ce cgi .... ça me simplifierai pas mal de problèmes ...

    enfin, merci ... je vais bidouiller un truc

  12. #12
    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,

    les problèmes que tu rencontres sont typiquement ceux qui se posent quand on essaye d'appliquer à XSLT les mêmes méthodes de raisonnement et de conception que celles d'un langage procédural, tel que C par exemple.

    La solution a ton problème est sans doute bien plus simple que tu ne l'imagines. Mais pour la trouver, il faut raisonner "XSLT", c'est à dire récursivité, programmation fonctionnelle, XML. On peut t'y aider, décris-nous juste un peu plus ton problème.

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 95
    Points : 77
    Points
    77
    Par défaut
    bah .... voila je part d'un fichier xml comme cela

    fichier 1
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    <!--    PARAMETER 1    -->
    <parameter>
    <name >data</name>
    <attributes>
    <line>1</line>
    </attributes>
    </parameter>
     
    <!--    PARAMETER 2    -->
    <parameter>
    <name>query_data</name>
    <attributes>
    <line>2</line> 
    </attributes>
    </parameter>
     
     
    <!--    PARAMETER 3    -->
    <parameter>
    <name>a</name>
    <attributes>
    <line>3</line>
    </attributes>
    </parameter>
     
    <!--    PARAMETER 4    -->
    <parameter>
    <name>atoms</name>
    <attributes>
    <line>3</line> 
    </attributes>
    </parameter>
     
    <!--    PARAMETER 5    -->
    <parameter>
    <name>w</name>
    <attributes>
    <line>5</line> 
    </attributes>
    </parameter>
     
    <!--    PARAMETER 6    -->
    <parameter>
    <name>wmin</name>
    <attributes>
    <line>5</line>
    </attributes>
    </parameter>
     
    <!--    PARAMETER 7   -->
    <parameter>
    <name>wmax</name>
    <attributes>
    <line>5</line>
    </attributes>
    </parameter>
    et je voudrais le transformer en

    fichier 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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    <parameters>
     
    <!--    PARAMETER 1    -->
    <parameter>
    <name >data</name>
    </parameter>
     
    <!--    PARAMETER 2    -->
    <parameter>
    <name>query_data</name>
    </parameter>
     
     
    <!--    PARAMETER 3    -->
    <parameter>
    <name>a</name>
    </parameter>
     
    <!--    PARAMETER 4    -->
    <parameter>
    <name>atoms</name>
    </parameter>
     
    <!--    PARAMETER 5    -->
    <parameter>
    <name>w</name>
    </parameter>
     
    <!--    PARAMETER 6    -->
    <parameter>
    <name>wmin</name>
    </parameter>
     
    <!--    PARAMETER 7   -->
    <parameter>
    <name>wmax</name>
    </parameter>
     
    </parameters>
     
    <layout>
    	<hbox>
    		<box>data</box>
    	</hbox>
    	<hbox>
    		<box>query_data</box>
    	</hbox>
    	<hbox>
    		<box>a</box>
    		<box>atoms</box>
    	</hbox>
    	<hbox>
    		<box>w</box>
    		<box>wmin</box>
    		<box>wmax</box>
    	</hbox>
    </layout>
    voila. toute la partie <parameters>...</parameters> c'est bon.

    c'est la partie <layout> qui me pose problème...

    en effet on retrouve au seins d'un même <hbox> ... </hbox> tout les parametres qui dans le fichier1 avec la même valeur dans <line> ... </line>
    et on crée un bloc de <hbox> par valeur de <line>

    mais je ne vois pas comment faire

    merci

  14. #14
    Membre éprouvé Avatar de laurentibus
    Inscrit en
    Mars 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2008
    Messages : 875
    Points : 908
    Points
    908
    Par défaut
    ah je vois enfin ce que tu voulais comme quoi de bonne explication c'est cool
    .....

    bon ben il faut que tu parcours toutes tes balises <line> et que tu prenne ou nom la valeur de la balise <name>

    exmple :
    <xsl:element name=parameter>
    for each //line[text = 1]
    le nom a mettre
    </for each>
    </xsl:element>

    et tu fais ca pour toutes les valeurs que le texte des balise line peut prendre

    voila la c'est clair ?


  15. #15
    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
    Il s'agit d'un problème classique de regroupement d'éléments (ici les éléments <line>).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        <xsl:key name="lines" match="line" use="."/>
        ...
        ...
            <layout>
                <xsl:for-each select="//parameter/attributes/line[generate-id() = generate-id(key('lines', .)[1])]">
                    <hbox>
                        <xsl:for-each select="key('lines', current())/../../name">
                            <box><xsl:value-of select="."/></box>
                        </xsl:for-each>
                    </hbox>
                </xsl:for-each>
            </layout>

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 95
    Points : 77
    Points
    77
    Par défaut
    Ok merci ...

    ça à l'air d'etre bon .... manque plus qu'a le tester ... enfin quand le serveur de test sera opérationnel


    MERCI

    bonne Journée

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

Discussions similaires

  1. [XSLT]balises meta
    Par Crazyfaboo dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 04/07/2007, 14h06
  2. [XSLT] Balises conditionnelles
    Par ploxien dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 23/11/2006, 16h30
  3. [XSLT] Balise issue d'une variable
    Par ploxien dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 22/11/2006, 14h20
  4. [XSLT] Balise for-each et caractères spéciaux
    Par Guilbert69 dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 09/10/2006, 11h37
  5. [.NET][XSLT] balise META
    Par virgul dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 03/05/2005, 11h35

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