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 :

call template et portée de variable ? [XSLT 1.0]


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre actif
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2007
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 199
    Points : 297
    Points
    297
    Par défaut call template et portée de variable ?
    Bonjour à tous !

    J'ai une série de template qui appellent un test avec des paramètres :

    Si je met le test dans le template, cela fonctionne parfaitement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	<xsl:template match="/livre" mode="livres_bib_A">
    		<xsl:variable name="id" select="Index"/>
    		<xsl:variable name="vCond" select="/path1/path2/[Index=$id]/path3/v=1"/>
    		<xsl:variable name="path" select="/path1/path2[$vCond] | /path1/path2/path3/path4[not($vCond)]"/>
     
    	[pleins de XSL utilisant la variable $path]
     
    	</xsl:template>
    Fort de cela, et vu que je dois appliquer cela à des centaines de templates différents, j'ai donc décidé de remplacer le test écrit directement dans le template par un classique call-template en passant le paramètre id utilisé dans mes tests de variable.

    Donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	<xsl:template match="/livre" mode="livres_bib_A">
    		<xsl:call-template name="templatecondition">
    			<xsl:with-param name="id" select="Index"/>
    		</xsl:call-template>
     
    		[pleins de XSL utilisant la variable $path]
     
    	</xsl:template>
    et donc le template appelé correspondant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	<xsl:template name="templatecondition">
    		<xsl:param name="id"/>
    		<xsl:variable name="vCond" select="/path1/path2/[Index=$id]/path3/v=1"/>
    		<xsl:variable name="path" select="/path1/path2[$vCond] | /path1/path2/path3/path4[not($vCond)]"/>
    	</xsl:template>

    et là... ca ne fonctionne pas ! enfin quelque soit la valeur de v, je suis toujours dans le cas de [not($vCond)].

    Je suspecte bien une histoire de portée de variable, mais dans ce cas là je ne vois pas pourquoi la portée changerait (entre directement dans le template et passée par le call-template)

    Je suis preneur de quelques éclaircissements dans le concept

    Merci
    "Chuck Norris a déjà compté jusqu'à l'infini. Deux fois."

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Hello,

    Une variable est déclarée à l'intérieur d'un élément parent.

    Il y a les variables globales, déclarées directement dans <xsl:stylesheet>. Leur portée s'applique à toutes les déclarations de variables faites après la leur, et à tous les templates de la stylesheet.

    Et les variables locales, déclarées quelque part dans un template. Leur portée commence après leur déclaration, et se termine à la fermeture de leur élément parent.

    Il n'est donc pas possible de déclarer une variable dans un template et de s'en servir dans un autre. Normalement ton moteur XSLT devrait refuser de travailler si tu essayes. Sauf s'il se trouve par hasard que tu as aussi une variable globale du même nom. Les variables locales de même nom qu'une variable globale sont autorisées, et masquent la variable globale sur toute leur portée.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre actif
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2007
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 199
    Points : 297
    Points
    297
    Par défaut
    Merci Thelvin pour ton analyse.
    Effectivement j'avais oublié combien les règles de portée de variable était contraignantes en XSL...
    C'est clair maintenant.
    "Chuck Norris a déjà compté jusqu'à l'infini. Deux fois."

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Techniquement la portée, ça marche pareil que pour tous les autres langages.

    Le fait que ce soit un langage déclaratif et donc qu'on ne puisse pas changer la valeur d'une variable après sa déclaration, c'est une autre histoire. Il y a même des gens qui aiment ce concept, dans un langage de programmation.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre actif
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2007
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 199
    Points : 297
    Points
    297
    Par défaut
    ...il en faut pour tous les goûts ! :-) j'aime bien pouvoir changer la valeur d'une variable après l'avoir déclaré, ca m'est beaucoup plus naturel !
    "Chuck Norris a déjà compté jusqu'à l'infini. Deux fois."

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

Discussions similaires

  1. [XSLT] utilisation de <xsl:call-template>/compteur xsl
    Par ogn dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 05/02/2008, 10h22
  2. Réponses: 1
    Dernier message: 15/05/2007, 10h19
  3. [XSLT] Call-template question de débutant
    Par ben23 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 14/07/2006, 00h20
  4. [XSLT] Différence entre apply-templates et call-template
    Par Cpt.FLAM dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 04/04/2005, 18h47
  5. différence call-template et apply-templates
    Par mousstik dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 08/11/2004, 12h28

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