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 :

boucle <xsl:for-each>


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Décembre 2005
    Messages : 117
    Points : 48
    Points
    48
    Par défaut boucle <xsl:for-each>
    Bonjour à vous, j'ai un petit problème. Je sais que le for-each ne se comporte pas comme une boucle for mais je souhaiterai pouvoir sortir de ma boucle quand mon indice est trouvé.
    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <xsl:for-each select="//ROOT/I">
    <xsl:variable name="categorie"><xsl:value-of select="@C" /></xsl:variable>
    <xsl:for-each select="document("toto.xml")/CATEGORIE/S">
      <xsl:if test="@ID = $categorie">
         <input type="button">
              <xsl:attribute name="value">
                  <xsl:value-of select="@L" />
              </xsl:attribute>
         </input>
       </xsl:if>
    </xsl:for-each>
    </xsl:for-each>
    le souçi c'est qu'il va jusqu'au bout, cad que si il trouve plusieurs fois, il affiche plusieurs fois. J'aimerai pouvoir sortir de la boucle d'un maniere ou d'une autre.
    J'ai essayé avec une variable "trouvé" mais vu qu'elle se comporte comme une constante, je ne peux pas lui affecter de valeur.
    Je pense à uen solution mais je ne sais pas si cela est possible: Peut on, une fois le input généré, dire à ma boucle for-each de se positionner sur son dernier fils ?

    Pouvez vous m'aider ?
    Sinon, si quelqu'un a une autre solution, je suis preneur...

    Merci d'avance

  2. #2
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Points : 786
    Points
    786
    Par défaut
    au début aussi j aurais bcp aimé pouvoir faire un break
    le truc c de ne pas tout prendre dans ta boucle, de la faire arrêter quand tu rencontres la condition que tu veux fixer...
    Or ici ce n est pas tout à fait cela, apparement tu recherches un élément en particulier ce qui n est pas pareil, dans ce cas là il faut pointer directement vers l élément voulu...
    pour commencer simple cela s ecrit ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	<xsl:for-each select="//ROOT/I">
    		<xsl:variable name="categorie"><xsl:value-of select="@C"/></xsl:variable>
    		<xsl:if test="document('toto.xml')/CATEGORIE/S[@ID=$categorie]">
    			<input type="button">
    				<xsl:attribute name="value"><xsl:value-of select="@L"/></xsl:attribute>
    			</input>
    		</xsl:if>
    	</xsl:for-each>
    ici je dit que pour chaque <I>, je teste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:if test="document('toto.xml')/CATEGORIE/S[@ID=$categorie]">
    ce qui signifie en français:
    "y a t il dans le doc toto une CATEGORIE dont un element S avec un attribut ID= à la variable categorie"...si oui, j execute le code suivant...

    je ne sais pas si ta boucle doit s arreter dans le premier cas aussi, si c est le cas, essaie d apporter un peu plus de précision sur ton probleme
    Je ne sais pas si cela aura été assez clair...

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

    ton problème se résoud simplement sans boucle imbriquée quand on sait qu'en XPath on peut demander à ne sélectionner que le n-ième noeud d'une liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:for-each select="//ROOT/I"> 
         <input type="button" value="{document("toto.xml")/CATEGORIE/S[@ID = current()/@C][1]/@L}" /> 
    </xsl:for-each>
    L'usage de current(), qui désigne le noeud courant (celui sélectionné par le for-each) t'évite de passer par une variable pour @C. Le prédicat [1] ne sélectionne que le premier noeud de la liste de noeud sélectionnée par le prédicat [@ID = current()/@C]. Enfin, les accolades permettent de placer le résultat renvoyé par une expression XPath dans l'attribut d'un élément non XSLT.

  4. #4
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Décembre 2005
    Messages : 117
    Points : 48
    Points
    48
    Par défaut probleme XSL for-each
    ça ne fonctionne pas, enfin si, mais il m'affiche toutes les catégories même celles qui sont indiquées deux fois...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <ROOT>
      <CATEGORIES_S>
        <S ID="11" D="6|8" L="Catégorie N°1" />
        <S ID="12" D="1|8" L="Catégorie N°2" />
        <S ID="13" D="1|2|5" L="Catégorie N°3" />
      </CATEGORIES_S>
    </ROOT>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <ROOT>
      <I L="Température" U="°C" C="11" W=""/>
      <I L="Consigne Chaud" U="°C" C="11" W="2"/>
      <I L="Consigne Froid" U="°C" C="11" W="2"/>
      <I L="Ouverture vanne" U="%" C="12" W="2"/>
      <I L="Compteur" U="m/s" C="13" W="12" />
    </ROOT>
    du coup il m'affiche 3 fois la Catégorie N°1, et une fois la Catégorie N°2 et une fois la Catégorie N°3.

    Pouvez-vous m'éclaircir ?

    Merci d'avance

  5. #5
    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
    Quel est le but, exactement ? Donne un exemple de XML à obtenir en sortie.

  6. #6
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Points : 786
    Points
    786
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:if test="document("toto.xml")/CATEGORIE/S[@ID = //ROOT/I/@C]/@L">
      <input type="button" value="{document("toto.xml")/CATEGORIE/S[@ID = //ROOT/I/@C]/@L}"/>
    </xsl:if>
    je ne uis pas très sûr mais à priori s il trouve la condition quelque part alors il l executera...qu une fois...
    mais c 'est un peu bizarre ton truc

  7. #7
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Décembre 2005
    Messages : 117
    Points : 48
    Points
    48
    Par défaut
    mon résultat doit être de 3 onglets (boutons) étant:
    Catégorie S1 , Catégorie S2 , Catégorie S3.

    En français, je veux afficher les catégories S de (Categories.xml) dont leur ID (par exemple 11) est au moins présent dans "Variables.xml" (dont C=11 au moins une fois).
    Cependant, je ne veux afficher qu'une seule fois la catégorie.

    J'y arrive presque grace à vos propositions, mais il m'affiche 3 fois la catégorie S1, une fois la catégorie S2 et une fois la catégorie S3.

    Alors que je voudrais seulement : (catégorie S1) - (catégorie S2) - (Catégorie S3)

    Je vous redonne mes fichiers...

    Catégorie.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <ROOT> 
      <CATEGORIES_S> 
        <S ID="11" D="6|8" L="Catégorie N°1" /> 
        <S ID="12" D="1|8" L="Catégorie N°2" /> 
        <S ID="13" D="1|2|5" L="Catégorie N°3" /> 
        <S ID="14" D="1|2|5" L="Catégorie N°4" />
        <S ID="15" D="1|2|5" L="Catégorie N°5" />
        <S ID="16" D="1|2|5" L="Catégorie N°6" />
      </CATEGORIES_S> 
    </ROOT>
    et Variables.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <ROOT> 
      <I L="Température" U="°C" C="11" W=""/> 
      <I L="Consigne Chaud" U="°C" C="11" W="2"/> 
      <I L="Consigne Froid" U="°C" C="11" W="2"/> 
      <I L="Ouverture vanne" U="%" C="12" W="2"/> 
      <I L="Compteur" U="m/s" C="13" W="12" /> 
    </ROOT>
    Je sais pas si c'est plus clair pour vous.
    Merci encore pour votre aide...

  8. #8
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Points : 786
    Points
    786
    Par défaut
    as tu une condition à mettre sur l attibut @L?

  9. #9
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Décembre 2005
    Messages : 117
    Points : 48
    Points
    48
    Par défaut
    Non, sur l'attribut @L de Categorie.xml, je n'ai aucune condition, en fait, cet attribut est le nom de mon bouton. Enfin si, désolé, quelque part il y a une condition, c'est qu'il doit se retrouver qu'une seule fois à l'affichage, alors que son @ID est présent 3 fois dans Variables.xml.

  10. #10
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Points : 786
    Points
    786
    Par défaut
    bon...personnelement j ai fait "dans l autre sens..." j ai changé donné un nom arbitraire

    CAT.XSL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?xml version="1.0" encoding="UTF-16"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
    	<xsl:template match="/">
    		<xsl:apply-templates/>
    	</xsl:template>
    	<xsl:template match="*">
    		<xsl:apply-templates/>
    	</xsl:template>
    	<xsl:template match="S">
    		<xsl:if test="@ID=document('Variables.xml')//I/@C">
    			<input type="button" value="{document('Variables.xml')//I[@C=current()/@ID]/@L }"/>
    		</xsl:if>
    	</xsl:template>
    </xsl:stylesheet>

  11. #11
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Décembre 2005
    Messages : 117
    Points : 48
    Points
    48
    Par défaut
    et dans mon XSL de base que j'utilisais jusque là, je peux importer ce fichier CAT.XSL pour qu'il l'éxécute ?

  12. #12
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Points : 786
    Points
    786
    Par défaut
    si tu as déja un traitement sur ton xml à partir d un xsl, le plus simple serait d y copier ce template
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       <xsl:template match="S">
          <xsl:if test="@ID=document('Variables.xml')//I/@C">
             <input type="button" value="{document('Variables.xml')//I[@C=current()/@ID]/@L }"/>
          </xsl:if>
       </xsl:template>

  13. #13
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Décembre 2005
    Messages : 117
    Points : 48
    Points
    48
    Par défaut
    oui mais le problème c'est que le traitement de mon XML à partir du xsl est un autre fichier XML.

    Je crois qu'il est impossible de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:template match="document('Categorie.xml')//S"> 
          <xsl:if test="@ID=document('Variables.xml')//I/@C"> 
             <input type="button" value="{document('Variables.xml')//I[@C=current()/@ID]/@L }"/> 
          </xsl:if> 
    </xsl:template>

  14. #14
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Points : 786
    Points
    786
    Par défaut
    ok je comprends
    et bien effectivement il ne faut pas faire de template dans ce cas là mais écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:for-each select="document('Categorie.xml')//S">
          <xsl:if test="@ID=document('Variables.xml')//I/@C">
             <input type="button" value="{document('Variables.xml')//I[@C=current()/@ID]/@L }"/>
          </xsl:if>
    </xsl:for-each>
    ...j espere que ça devrait aller là

  15. #15
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Décembre 2005
    Messages : 117
    Points : 48
    Points
    48
    Par défaut
    C'est cool, C'est presque bon, il m'affiche :
    Température, ouverture vanne, et Compteur (ce qui correspond aux @ID 11, 12 et 13)

    La seul différence, c'est que je dois afficher Catégorie N1 (@ID=11) Catégorie N2 (@ID=12) et Catégorie N3 (@ID=13)

  16. #16
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Points : 786
    Points
    786
    Par défaut
    au lieu du input tu écris...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     <input type="button" value="{current()/@L }"/>

  17. #17
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Décembre 2005
    Messages : 117
    Points : 48
    Points
    48
    Par défaut
    Merci, je te remercie beaucoup, ça faisait tellement longtemps que je cherchais cette solution !

    Franchement, si je peux t'aider à l'occasion un de ces 4, je le ferais avec grand plaisir !
    Merci encore tiscars.

    Et bonne journée

  18. #18
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Points : 786
    Points
    786
    Par défaut
    bah certainement...je ne sais pas en quel langage mais c fort possible ...
    en tout cas bon courage et n oubli pas le tag résolu

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

Discussions similaires

  1. Boucle xsl:for-each provoque une erreur
    Par Max1000p dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 05/06/2012, 17h41
  2. xsl:for-each avec un parametre pour select
    Par arnog dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 26/08/2008, 13h09
  3. xsl:for-each
    Par ashurai dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 10/01/2006, 11h54
  4. [XSL] for-each + sort, et comparaison current previous value
    Par johan_barbier dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 18/11/2005, 16h46
  5. [XML/XSL] for-each imbriqués
    Par grome dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 11/11/2005, 12h44

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