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 :

[XSL]Problème de portée des variables


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 5
    Points : 4
    Points
    4
    Par défaut [XSL]Problème de portée des variables
    Salut à tous

    je code actuellement un template pour des elements de menu recursifs,

    Je souhaite définir un evenement onClick a tous les MenuItem ayant un sous MenuItem pour qu'il affiche(ou cache) les sous elements

    Voici le code que j'utilise actuellement (PAs forcement très propre je ne fais du XML que depuis Hier)

    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
    <xsl:template match="MenuItem">
    <xsl:variable name="OnClickMethod"/>
    	<xsl:choose>
    			<xsl:when test="count(child::MenuItem)>0">
    				<SPAN id="{concat(ID,'_plus')}" name="{concat(ID,'_plus')}" OnClick="afficher_cacher('Sub_{ID}');">+</SPAN>
    				<xsl:variable name="tempstring">afficher_cacher("Sub_</xsl:variable>
    				<xsl:variable name="tempstring2" select ="concat($tempstring,ID)"/>
    				<xsl:variable name="tempstring3">');return;</xsl:variable>
    				<xsl:variable name="OnClickMethod" select="concat($tempstring2,$tempstring3)"/>
    			</xsl:when>
    			<xsl:otherwise>
    				<xsl:variable name="OnClickMethod"></xsl:variable>
    			</xsl:otherwise>
    	</xsl:choose>
     
    	<a href="{Action}" OnClick="{$OnClickMethod}">
    		<xsl:choose>
    			<xsl:when test="count(ancestor::*)=1">
    				<SPAN STYLE="FONT-WEIGHT: bold; FONT-SIZE: 14pt; COLOR: blue">
    					<xsl:value-of select="Libelle"/>
    				</SPAN>
    			</xsl:when>
    			<xsl:when test="count(ancestor::*)=2">
    				<SPAN STYLE="FONT-WEIGHT: bold; FONT-SIZE: 12pt; COLOR: lightblue">
    					<xsl:value-of select="Libelle"/>
    				</SPAN>
    			</xsl:when>
    			<xsl:otherwise>
    						<xsl:value-of select="Libelle"/>
    				</xsl:otherwise>	
    		</xsl:choose>
    	</a>
    	<BR/>
    	<UL>
    		<DIV id="Sub_{ID}" style="display:block">
    			<xsl:apply-templates select="MenuItem"/>
    		</DIV>		
    	</UL>
     
    </xsl:template>

    Lorsque j'utilise ce template pour afficher mon XML, le navigateur me dit:
    Impossible de définir deux fois la variable ou le paramètre 'OnClickMethod' au sein du même modèle.
    Lorsque j'enlève la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:variable name="OnClickMethod"/>
    Je n'ai plus le message d'erreur mais un autre qui m'indique:
    Impossible de résoudre une référence à une variable ou un paramètre « OnClickMethod ». La variable ou le paramètre ne sont peut être pas définis ou sont absents de la portée
    Comment puis faire pour définir au sein de mon xsl:choose une variable à portee globale? Ou comment définir une variable globale sans lui affecter tout de suite une valeur?

    J'ai déjà jeté un oeil au post http://www.developpez.net/forums/viewtopic.php?t=243086 et les references associées mais je n'ai rien trouvé de convaincant.


    Quelqu'un aurait il une de ce que pourrais utiliser pour palier a ce probleme?

    MErci par avance.

  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 Re: [XSL]Problème de portée des variables
    Citation Envoyé par djulesp
    Comment puis faire pour définir au sein de mon xsl:choose une variable à portee globale? Ou comment définir une variable globale sans lui affecter tout de suite une valeur?

    J'ai déjà jeté un oeil au post http://www.developpez.net/forums/viewtopic.php?t=243086 et les references associées mais je n'ai rien trouvé de convaincant.
    Sans doute car ce qu tu demandes est impossible.On ne peut pas redefinir une variable xslt ,et elle est obligatoirement locale au noeud ou elle est spécifiée.
    Je croyais pourtant l'avoir ecris noir sur blanc.

  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
    Pourquoi ne fais-tu pas le contraire, c'est à dire placer le xsl:choose à l'intérieur du xsl:variable ?
    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

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Merci pour les réponses,

    Sans doute car ce qu tu demandes est impossible.On ne peut pas redefinir une variable xslt ,et elle est obligatoirement locale au noeud ou elle est spécifiée.
    Je croyais pourtant l'avoir ecris noir sur blanc.
    Autant pour moi quand je parle d'une variable je parle d'une variable dans son sens propre et non a son sens XML/XSL. CE que je veux faire est bien une variable et non une constante locale.

    d'autre part je n'ai pas compris:
    Pourquoi ne fais-tu pas le contraire, c'est à dire placer le xsl:choose à l'intérieur du xsl:variable ?
    il faudrait me montrer comment je peux executer du "code" xsl au sein d'une variable. Est ce un truc comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:variable name="MaVar" select="UneValeur">
    ... DU CODE XSL POUR FORMATER MES DONNEES UTILISANT DES 
             <xsl:value-of select="MaVar"/>
    ....
    </xsl:variable>

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2004
    Messages : 85
    Points : 107
    Points
    107
    Par défaut
    Une variable en XSL est en fait une valeur qui est initialisée par un bout de code ou un "select" ou par définition d'une constante... En fait, il faut un peu réfléchir différemment concernant les variables étant donné qu'une fois définie, une variable ne peut être redéfini...

    Références : http://www.w3schools.com/xsl/el_variable.asp

  6. #6
    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
    exempletaper direcy ici donc peut y avoir des erreurs de syntaxe)

    xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <racine>
      <a>1</a>
      <a>2</a>
      <a>3</a>
      <a>4</a>
    </racine>

    declaration de variable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <xsl:variable name="truc">
       <xsl:for-each select="//a">
          <xsl:if test="a&gt;2">
              <xsl:value-of select="concat(.,';')"/>
          </xsl:if>
       </xsl:for-each>
     
    </xsl:variable>
    son affichage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:value-of select="$truc"/>
    resultat
    3;4;
    Pour le reste le concept de "variable" n'existe tout simplement pas en xslt, inutile donc de chercher danc cette voie

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Ok j'ai compris

    Merci

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

Discussions similaires

  1. problème de portée des variables
    Par rominous41 dans le forum VBA Access
    Réponses: 1
    Dernier message: 03/05/2011, 14h43
  2. Problème portée des variables
    Par thanks33 dans le forum Débuter
    Réponses: 4
    Dernier message: 15/06/2009, 09h17
  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. Compteur XSL...Portée des variables limitée
    Par lanfeustdetroy dans le forum XSL/XSLT/XPATH
    Réponses: 11
    Dernier message: 03/06/2005, 14h12
  5. [Portée] portée des variables
    Par parksto dans le forum Langage
    Réponses: 7
    Dernier message: 09/05/2004, 21h05

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