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] Stocker un jeu de noeud dans une variable


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut [XSL] Stocker un jeu de noeud dans une variable
    Bonjour,

    Stocker un jeu de noeud dans une variable est possible si l'on utilise l'attribut select de xsl:variable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:variable name="var" select="//b" />
    En revanche, je désire définir le contenu de la variable entre ses balises et non par select, parce que notement, j'ai besoin de tests conditionnels pour le choix de l'affectation, je n'obtient plus un jeu de noeuds.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:variable name="var">
     <xsl:value-of select="//b" />
    </xsl:variable>
    Reformuler autrement, j'aimerais bien qu'un call-template puisse me retourner un jeu de noeud, de la même manière.

    J'utilise le moteur XSLT de Firefox qui me donne une erreur lorsque j'essaie d'accèder à la propriété p d'un noeud b du code test.xml suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <?xml-stylesheet type="text/xsl" href="test.xsl"?>
    <a>
     <b p="1">x</b>
     <b p="2">y</b>
     <b p="3">z</b>
    </a>
    le fichier test.xsl étant :

    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
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
    <xsl:output method="html" indent="yes" encoding="UTF-8" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" />
     
    <xsl:template match="/">
     <html>
      <body>
       <xsl:variable name="var">
        <xsl:call-template name="fonction" />
       </xsl:variable>
       <xsl:value-of select="//b[@p = '2']" />
       <br />
       <xsl:value-of select="$var" />
       <br />
       <xsl:value-of select="$var/@p" />
      </body>
     </html>
    </xsl:template>
     
    <xsl:template name="fonction">
     <xsl:value-of select="//b[@p = '2']" />
    </xsl:template>
     
    </xsl:stylesheet>
    La ligne fautive :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       <xsl:value-of select="$var/@p" />
    Les deux premiers value-of affichent le contenu de la balise b c'est à dire "y". J'ai tenté à tout hasard un copy-of à la place de value-of dans le template "fonction".

    Avez vous une solution à ce problème ?


    Blustuff.

  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
    ce n'est pas possible en xslt 1.0 mais ça l'ai avec xslt 2.0 .
    Voir du coté du processeur saxon pour ça

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Diantre... Mes rêves s'envolent...

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Ah j'aurais peut être une solution avec key... mais... peut on référencer des éléments d'un autre document xml (fonction xpath document) avec xsl:key ?

  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
    Citation Envoyé par Blustuff
    Ah j'aurais peut être une solution avec key... mais... peut on référencer des éléments d'un autre document xml (fonction xpath document) avec xsl:key ?
    Oui et non
    xsl:key fonctionne sur le "xml courant"
    Soit doc1 ton document de base et docExt celui que tu appelles.
    Si ton noeud courant (voir ici)appartient à doc1 la fonction key ne te renverra que des noeuds appartenant à doc1 et idem pour docExt.
    Pour parer à ça on peut généralement utiliser une astuce.
    On sauvegarde dans une ou plusieurs variables les elements de doc1 , on crée une boucle "fictive" sur docExt, et on fait le lien à l'intérieur de cette boucle en utilsant la ou les variables précédentes ou vice versa varaibles dur docExt, boucle fictive sur doc1

    je suis assez clair ?

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Euh... j'ai du mal a comprendre... xsl:key ne devrait pas etre en dehors de xsl:template ? La notion de noeud courant me parait alors plutot floue :/

  7. #7
    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 Blustuff
    Euh... j'ai du mal a comprendre... xsl:key ne devrait pas etre en dehors de xsl:template ? La notion de noeud courant me parait alors plutot floue :/
    xsl:key oui,
    mais c'est la fonction key qui permet d'utiliser le résultat de la création de cet "index"

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Alors je n'ai pas compris l'astuce. Si l'index ne référence pas les éléments des autres documents xml, je ne comprends pas comme elle me permettrait d'y accèder par key().

  9. #9
    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 Blustuff
    Alors je n'ai pas compris l'astuce. Si l'index ne référence pas les éléments des autres documents xml, je ne comprends pas comme elle me permettrait d'y accèder par key().
    Avec xsl:key tu ne reference pas les balises d'un document mais un jeu de blise qu'il recherchera dans tous documents utilisé

    soit le xml de "travail" doc1
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <a>
    	<b>
    		<a>
    			<c/>
    		</a>
    	</b>
    	<d>
    		<a>
     
    		</a>
    	</d>
    	<f>
    		<a>
    			<a/>
    		</a>
    	</f>
     
    </a>
    soit docExt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?xml version="1.0" encoding="UTF-8"?>
    <r>
    	<b>
    		<a>
    			<c/>
    		</a>
    	</b>
     
    </r>
    <xsl:key name="exemple" match="a" use="ce-qui-est-utile"></xsl:key>
    Pour simplifier (un peu trop )
    Reference TOUS les noeuds a, ou qu'ils se trouvent dans l'arborescence, de tous les doc xml qui seront utilisé, mais la fonction key ne renvoit que ceux qui appartiennent au même document que le noeud courant

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Ok, merci pour cet éclaircissement. Ca ne résoud finalement pas le problème. Cela dit, en utilisant quand même key et en transposant les if, choose etc. par des unions d'ensembles, j'ai réussi à faire une expression qui tient en une ligne. Du coup c'est moins gênant, même si apparaissant à trois endroits différents du xsl, et certainement plus en fin de compte, elle risque d'entraver la souplesse du XSL.

    Merci pour toutes ces réponses, elles m'on bien guidées. Je regarde néanmoins avec gourmandise XSLT 2.0


    Blustuff.

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

Discussions similaires

  1. Supprimer un certain noeud dans une variable XML
    Par benthebest dans le forum jQuery
    Réponses: 3
    Dernier message: 30/09/2009, 18h07
  2. [VBS]Stocker résultat d'un SELECT dans une variable
    Par harry le ravi dans le forum VBScript
    Réponses: 2
    Dernier message: 13/08/2009, 12h52
  3. [XSLT]mettre un noeud dans une variable
    Par Morbo dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 15/06/2007, 21h28
  4. Stocker un couple de registres dans une variable
    Par Snake39 dans le forum Assembleur
    Réponses: 4
    Dernier message: 16/11/2006, 10h29
  5. Stocker un noeud dans une variable
    Par Devotion dans le forum XSL/XSLT/XPATH
    Réponses: 14
    Dernier message: 23/09/2004, 17h02

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