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 :

Stocker un noeud dans une variable


Sujet :

XSL/XSLT/XPATH XML

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12
    Points : 4
    Points
    4
    Par défaut Stocker un noeud dans une variable
    J'espère que je post au bon endroit (désolé, si ce n'est pas le cas)

    Je rencontre actuellement un problème en XSL.

    J'expose mon problème :
    Par exemple, je dispose du noeud XML suivant :

    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
    <CATALOGUE>
        <CD type="album">
            <TITLE>Century Child</TITLE>
            <ARTIST>Nightwish</ARTIST>
            <COUNTRY>Finlande</COUNTRY>
            <COMPANY>Spinefarm</COMPANY>
            <TRACKS>12</TRACKS>
            <YEAR>2002</YEAR>
        </CD>
     
        <CD type="album" date="07062004">
            <TITLE>Once</TITLE>
            <ARTIST>Nightwish</ARTIST>
            <COUNTRY>Finlande</COUNTRY>
            <COMPANY>Nuclear Blast</COMPANY>
            <TRACKS>12</TRACKS>
            <YEAR>2004</YEAR>
        </CD>
    </CATALOGUE>

    Je veux stocker (ou pointer) un noeud ainsi que toute son arborescence dans une variable à l'aide de .

    Supposons que je me trouve à la racine du XML, je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <xsl:variable name="NewCD" select="//CD[@date = '07062004']">
    </xsl:variable>
    Je met, ainsi, le 2ème noeud CD dans la variable.

    Je le passe ensuite en paramètre et mon problème survient quand je veux parcourir ce noeud contenu dans la variable.

    Ma question est : Est-il possible de parcourir l'arborescence du noeud contenu dans la variable (par exemple utiliser le XPATH suivant : "$NewCD/TITLE") ?

    J'ai lu que c'était possible mais je n'arrive pas à mettre ceci en oeuvre.

    J'espère avoir été assez clair et que quelqu'un pourra me venir en aide.

    Merci d'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
    Oui sa fonctionne tres bien(ton xpath est tout a fait bon "$NewCD/TITLE"), par contre ton pb vient peut etre de la porte de la variable.Laquelle n'existe que dans le noeud ou elle est declarée
    peut peut etre t'aider
    http://erwy.developpez.com/variable/

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    J'étais justement en train de lire ton topo sur les variables.
    Je crois que j'y ai trouvé le problème en lisant la partie node fragment.

    Je vais tester et je reviens si j'ai un problème.
    Merci à toi.


    edit : Voilà le message d'erreur que j'obtiens :

    La référence à une variable ou un paramètre « NewCD » doit correspondre à une liste de noeuds.

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    @Erwy : Effectivement, ça marche.

    Maintenant, mon autre problème est que j'ai besoin de passer cette variable en paramètre.

    Toujours avec le même XML :


    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:template match="/">
     
        <xsl:variable name="NewCD" select="//CD[@date = '07062004']"/>
     
        <xsl:value-of select="$NewCD/TITLE"/>
     
        <xsl:call-template name="func">
            <xsl:with-param name="NewCD">
                <xsl:value-of select="$NewCD"/>
            </xsl:with-param>
        </xsl:call-template>
    </xsl:template>
     
    <xsl:template name="func">
        <xsl:param name="NewCD"/>
     
        <xsl:value-of select="$NewCD/TITLE"/>
    </xsl:template>
    Le premier xsl:value-of select="$NewCD/TITLE" fonctionne bien, mais pas le deuxième (celui dans le template name="func").

    Et j'ai l'erreur suivante : La référence à une variable ou un paramètre « NewCD » doit correspondre à une liste de noeuds.



    En général, je passe les paramètres aux templates de cette manière avec xsl:with-param. Cela marche très bien pour les variables que je qualifierais de 'simples' (string ou entier) mais pour les noeuds, ça n'a pas l'air de marcher.

    Je n'ai pas la possibilité de déclarer cette variable en globale.

    Par contre, si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:template name="func">
        <xsl:param name="NewCD"/>
     
        <xsl:value-of select="$NewCD"/>
    </xsl:template>
    J'ai tous les éléments entre balise qui s'affichent comme tu l'as précisé dans ton topo sur les variables de type node fragment.

    J'ai besoin de cette variable dans un template ultérieur donc ma question est : "As tu une solution pour que je puisse passer cette variable contenant un noeud en paramètre à une template ?"

  5. #5
    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
    situ veux passer des noeuds evite le node fragment,utilise le select de param


    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
    <xsl:template match="/">
     
        <xsl:variable name="NewCD" select="//CD[@date = '07062004']"/>
     
        <xsl:value-of select="$NewCD/TITLE"/>
     
        <xsl:call-template name="func">
            <xsl:with-param name="NewCD2" select="$NewCD">
                       </xsl:with-param>
        </xsl:call-template>
    </xsl:template>
     
    <xsl:template name="func">
        <xsl:param name="NewCD2"/>
     
        <xsl:value-of select="$NewCD2/TITLE"/>
    </xsl:template>

  6. #6
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    essaye peut-être ça (je n'ai pas testé)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        <xsl:call-template name="func">
            <xsl:with-param name="NewCD" select="$NewCD"/>
        </xsl:call-template>

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    !!!!

    Ca marche bien là !
    Merci à vous, je vous aime !

    Je pensais que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:with-param name="truc" select="$machin"/>
    <=>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:with-param name="truc">
        <xsl:value-of select="$machin"/>
    </xsl:with-param>

    Pourriez-vous me dire la nuance???

  8. #8
    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
    Le param se comporte comme une variable(cours suivant si ca t'interesse attends quelques mois que je l'ecrive )
    Donc dans ta methode tu creais un node fragment.Or tu sais deja qu'on ne peut utiliser que les fonctions de string sur ce type de variables.
    Avec le select c'est bien le node set que tu passes.
    Si mon topo sur le sujet n'est pas assez clair n'hesite pas a m'envoyer un detail des section que tu as mal compris
    merci

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Non, au contraire, je viens de le relire et c'est très bien !

    Tu ne penses pas que tu devrais mettre une précision à ce sujet dans ton cours ? (à moins que je l'ai zappé...)

    Je n'étais pas au courant que je créais un node fragment en utilisant le xsl:value-of.

  10. #10
    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 en effet, je n'ai pas du assez developpe cette partie

    Il faut que je la corrige mais la je suis sur d'autre chapitre donc pas avant 2/3 semaines je penses

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    J'ai un problème à peu près similaire mais j'avoue ne pas voir la solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <xsl:template name="AutreChose">
        <xsl:variable name="truc">
            <xsl:call-template name="func"/>
        </xsl:variable>
    </xsl:template>
     
    <xsl:template name="func">
        <xsl:value-of select="//CD[@date = '07062004']"/>
    </xsl:template>
    Le template "func" retourne un noeud dans la variable "truc" mais tu es d'accord que c'est un noeud de type node fragment. (je viens de tester)



    Comment fais tu pour retourner un noeud de type node-set dans la variable "truc" à partir du template "func" ??

  12. #12
    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
    Citation Envoyé par Devotion
    J'ai un problème à peu près similaire mais j'avoue ne pas voir la solution :
    ....
    Comment fais tu pour retourner un noeud de type node-set dans la variable "truc" à partir du template "func" ??
    Moi non plus et pour ce que sais, pas possible de ramener un node set via un call-template

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Erf merci pour tout, tout de même !

  14. #14
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Pourrais tu me confirmer que dans ma méthode, je retourne bien un node fragment avec le call-template?

    Parce que si c'est le cas, il est sûrement possible de le convertir en node-set via la fonction msxsl:node-set(), non?

    Je viens de lire ça sur msdn : http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk/html/xmconProcessingaTreeFragmentasaTreebyUsingmsxslnodeset.asp

    Après si ce n'est pas un node fragment, c'est quoi ?

  15. #15
    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
    Citation Envoyé par Devotion
    Pourrais tu me confirmer que dans ma méthode, je retourne bien un node fragment avec le call-template?

    Parce que si c'est le cas, il est sûrement possible de le convertir en node-set via la fonction msxsl:node-set(), non?

    Je viens de lire ça sur msdn : http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk/html/xmconProcessingaTreeFragmentasaTreebyUsingmsxslnodeset.asp

    Après si ce n'est pas un node fragment, c'est quoi ?
    Bon
    1) En theorie c'est un node fragment mais comme tu n'as recopie que la avleur et non pas les balises,
    vois avec les xsl:copy ou xsl:copy-of, je ne pense pas que tu puisses le transformer en node set

    Pour le reste je n'ai jamais utilise cette option du processeur msxml donc pas d'avis.Attention, j'espere que tu as bien compris que ce code ne fait pas partie de xslt mais est une option d'un processeur?(donc ta feuille ne sera plus utilisable qu'avec lui si tu l'utilise)

Discussions similaires

  1. Stocker des balises dans une variable
    Par floran974 dans le forum Langage
    Réponses: 2
    Dernier message: 23/05/2009, 14h38
  2. Stocker du html dans une variable.
    Par Xunil dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 14/05/2009, 20h30
  3. [MIPS] [inline assembleur] Stocker un mot dans une variable
    Par wacho dans le forum Autres architectures
    Réponses: 0
    Dernier message: 02/01/2009, 16h23
  4. [XSL] Stocker un jeu de noeud dans une variable
    Par Blustuff dans le forum XSL/XSLT/XPATH
    Réponses: 9
    Dernier message: 22/06/2007, 13h01
  5. [XSLT]mettre un noeud dans une variable
    Par Morbo dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 15/06/2007, 21h28

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