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] Portée de variable


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2005
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 12
    Points : 11
    Points
    11
    Par défaut [xslt] Portée de variable
    Bonjour à tous, c'est mon premier post, ça fait plaisir de rentrer dans votre communauté

    Alors mon problème est assez simple je suppose, j'ai ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    <xsl:if test="$b &lt; 1345"> 
      <xsl:variable name="name_program_old" select="../h:a[text()]"/>
    </xsl:if>
     
    <xsl:value-of select="$name_program_old"/>
     
    <xsl:if test="$b &gt; 1345">
      <xsl:value-of select="$name_program_old"/>
    </xsl:if>
    Le value-of du milieu ne m'affiche pas la valeur de la variable créée dans le 1er if, et donc cela marche encore moins dans le 2e...mon but étant bien sur que ça marche dans le 2e, le value-of n'est qu'un test.

    Ca semble donc être un problème de portée, à savoir que tout ça est dans un for-each si ça a aucune espèce d'importance.

    J'ai pensé a with-param et param mais ça à l'air possible que pour passer d'un template a l'autre et ce n'est pas mon intention ici...
    Merci d'avance,

    Sid

  2. #2
    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
    Oui c'est bein un pb de portee, jette un coup d'oeil ici pour plus de details
    http://erwy.developpez.com/variable/#L1.2

    Si la valeur de ta variable est soumise a condition tu seras obligés de passer par un fragment node

  3. #3
    Membre à l'essai
    Inscrit en
    Novembre 2005
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Erwy,

    d'abord merci d'avoir pris le temps de me répondre, ensuite j'aurais deux questions à propos de cet exemple:

    1) Pourquoi, dans le 1er exemple, le résultat n'est-il pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <html>
    <body>
     
    	 appel première template
    	<br/>a<br/>b<br/>
    	 appel deuxième template
    	<br/>a<br/>c<br/>
    </body>
    </html>
    Je ne dois pas bien comprendre le apply-templates, pourquoi la dernière ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    appel deuxième template
    <br/>a<br/>c<br/>
    c'est à dire le résultat de ce apply-templates, est-il répété deux fois ?

    2) Dans le dernier exemple, comment peut-on mettre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <xsl:variable name="var1" select="//valeur[2]"></xsl:variable>
    Le //valeur[2] signifiant tous les 2e noeud appelé "valeur", la variable serait constamment ré-écrite, et finalement égale au "dernier 2e noeud", non ?
    Ou alors tu as utilisé //valeur[2] juste pour montré le fait que le résultat du XPath serait égal à 2 ?

    Mettons que ma dernière "devinette" soit bonne, je comprends le 12 (2+10 venant de var1 "locale") je comprends le 1er 2 (la variable "globale") mais je ne comprends pas le 2e 2, surement la même raison que mon 1er problème avec l'apply-templates en haut...

    3) Enfin, qu'est-ce qu'un fragment node ?

    Désolé de jouer mon boulet, mais j'étudie le XML depuis 10 jours et il y a de nombreux points qui me sont encore obscurs...
    Thanks,

    Sid

  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
    1) parce que dans le fichier xml il y a deux balises valeur

    2)Non, regarde les types de variables,c'est un node-set, cela selectionne TOUTES les balises selectionnees.

    3) dernier point du cours, dans ton cas , si c'est une seule valeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:variable name="name_program_old">
    <xsl:if test="$b &lt; 1345"> 
      <xsl:value-of select="../h:a[text()]"/> 
    </xsl:if> 
    </xsl:variable >

  5. #5
    Membre à l'essai
    Inscrit en
    Novembre 2005
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    1) Ok pour les balises valeur, c'était une erreur d'inattention de ma part je n'avais pas vu le XML de référence.

    2) select="//valeur[2]" veut donc dire JUSQU'A la 2e occurence ? est-ce que ça serait revenu au même de mettre select="//valeur" à la place ?

    3) C'est clair ça marche mieux en mettant le path plutot que les variables, je me souviendrais donc de ne pas mettre de variables lorsque ce n'est pas utile 8)

    Par contre j'ai maintenant le même problème pour mon for-each, et là, pas moyen de mettre de path, puisque je veux garder le contenu d'un noeud dans une variable, et l'utilisé dans un if après. Mon problème c'est que lorsqu'on arrive à la fin du for-each et que ça boucle, quand on "applique" le for-each sur la prochaine occurence, les variables n'existent plus. Ce serait surement un peu plus clair avec un peu de code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <xsl:for-each select="h:b[text()]">
    <!-- ici du code qui initialise $b et $emiss -->
     
    <xsl:if test="$b &gt; 1345">
    			<xsl:if test="$b_old &lt; 1345">
    				<xsl:value-of select="$emiss_old"/>
    			</xsl:if>
    		</xsl:if>
     
    <xsl:variable name="b_old" select="$b"/>
    <xsl:variable name="emiss_old" select="$emiss"/>
    </xsl:for-each>

    Pour régler le problème de non déclaration des variables, je les déclare globalement au début avec n'importe quelle valeur. Mais j'aimerais qu'après elles utilisent les valeurs traités dans le for-each, malheureusement comme je l'ai dit, $b_old et $emiss_old ne sont pas reconnues quand le for-each se "relance"...

    Une solution ?

    ^^ Merci

  6. #6
    Membre à l'essai
    Inscrit en
    Novembre 2005
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    J'ai résolu le problème en matchant plus haut et en déclarant donc les variables plus hautes dans l'arborescence du XSL...de sorte qu'elle soit visible dans les conditions en-dessous d'elles...

    Merci beaucoup !

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par mc_sid Voir le message
    J'ai résolu le problème en matchant plus haut et en déclarant donc les variables plus hautes dans l'arborescence du XSL...de sorte qu'elle soit visible dans les conditions en-dessous d'elles...

    Merci beaucoup !
    Bonjour mc_sid, est ce que tu pourrais mettre un exemple de code stp ? je suis dans la même galère et je ne comprends pas très bien ton explication.

    Merci
    Cdlt,
    Clem.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    En fait j'essaye d'ordonner mon document pour le traiter ensuite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      <xsl:variable name="sortedDocument">
        <xsl:for-each select="/posts/post">
          <xsl:sort select="@postedDate" data-type="number" order="ascending"/>
          <xsl:copy-of select="."/>
        </xsl:for-each>
      </xsl:variable >
    Car j'aurais besoin dans un second temps d'accéder à l'élément frère précédent, mais en considérant l'ordonnancement dans le temps.

    Mais j'ai une erreur qui dit que $sortedDocument n'est pas un XPath...

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

Discussions similaires

  1. la portée des variables globales en XSLT
    Par onh890 dans le forum XML/XSL et SOAP
    Réponses: 5
    Dernier message: 01/06/2012, 17h57
  2. [XSLT] Portée de variables dans un switch
    Par Xunil dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 14/08/2007, 13h29
  3. [XSLT] Problème avec la portée des variables
    Par sheura dans le forum XSL/XSLT/XPATH
    Réponses: 17
    Dernier message: 10/01/2006, 12h49
  4. [Portée] portée des variables
    Par parksto dans le forum Langage
    Réponses: 7
    Dernier message: 09/05/2004, 21h05
  5. [FLASH MX 2004][XML]portée de variable
    Par marco_ dans le forum Flash
    Réponses: 8
    Dernier message: 29/04/2004, 15h47

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