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 :

[XPath] test d'existence de noeud avec conditions sur les enfants [Débutant(e)]


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Rédacteur
    Avatar de MasterOfChakhaL
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2004
    Messages
    2 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 147
    Points : 3 264
    Points
    3 264
    Par défaut [XPath] test d'existence de noeud avec conditions sur les enfants
    Bonjour,

    Je souhaite définir le contenu d'une variable en fonction de certaines condition.

    Un peu de concret...:
    Dans mon document que je transforme je définis différents paramètres de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <parametre>
      <nom>paramNom</nom>
      <type>paramType</type>
      <valeur>paramValeur</valeur>
    </parametre>
    dans un autre endroit de mon xml, je peux faire référence à ces paramètres de la manière suivante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <style param="paramNom" />
    Dans un template qui match les éléments style je voudrais pouvoir définir une variable de cette manière

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <xsl:template match="style">
      <xsl:variable name="prefix">
        <xsl:if test=" m a   c o n d i t i o n ">'#' . </xsl:if>
      </xsl:variable>
      ... le reste ...
    </xsl:template>
    La condition que je cherche à écrire serait:
    il existe un noeud paramètre qui possède un noeud enfant (nom) dont la valeur vaut l'attribut param de style (le noeud qui match dans le template) et qui possède un noeud enfant (type) dont la valeur est la chaine 'color'.

    Pour l'instant, j'ai écris ce chemin pour mon test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //parametre[child::nom[text()=./@param] and child::type[text()='color']]
    Mais ca ne semble rien sélectionner...

    Je m'en remets donc à vous. Si a travers mon message vous constatez certaines erreurs classiques de débutants, n'hésitez surtout pas à me le dire...

    Merci de m'avoir lu jusque ici!
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    N'oubliez pas de cliquer sur quand votre question à trouvé une solution.

    Si vous n'avez pas encore lu les règles du club, mieux vaut tard que jamais!

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Points : 1 610
    Points
    1 610
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //parametre/nom/text()=./@param
    Ca a l'air de marcher.

  3. #3
    Rédacteur
    Avatar de MasterOfChakhaL
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2004
    Messages
    2 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 147
    Points : 3 264
    Points
    3 264
    Par défaut
    fiou!!

    J'ai finalement réussi à m'en sortir en procédant ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <xsl:template match="style">
    	<xsl:variable name="nom" select="@param" />
    	<xsl:variable name="prefix">
    		<xsl:if test="//parametre[nom[text()=$nom] and type[text()='color']]">'#' . </xsl:if>
    	</xsl:variable>
    	... le reste ...
    </xsl:template>
    Les questions que je me posent maintenant:
    Y avait-il un moyen qui ne nécessitait pas de créer la première variable?

    Pouvez vous confirmer cela:
    dans ce template, le noeud contextuel est un noeud 'style' (histoire de voir si je comprends bien la doc)

    Je passerai bientôt le sujet à résolu, mais je le laisse encore un peu ouvert le temps de recueillir quelques avis...
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    N'oubliez pas de cliquer sur quand votre question à trouvé une solution.

    Si vous n'avez pas encore lu les règles du club, mieux vaut tard que jamais!

  4. #4
    Rédacteur
    Avatar de MasterOfChakhaL
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2004
    Messages
    2 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 147
    Points : 3 264
    Points
    3 264
    Par défaut
    Citation Envoyé par Morbo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //parametre/nom/text()=./@param
    Ca a l'air de marcher.
    Effectivement, le test passe, cela dit, je ne vois pas comment combiner les deux conditions (qui s'appliquent sur un même noeud paramètre)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    N'oubliez pas de cliquer sur quand votre question à trouvé une solution.

    Si vous n'avez pas encore lu les règles du club, mieux vaut tard que jamais!

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Points : 1 610
    Points
    1 610
    Par défaut
    Oui, désolé j'ai lu trop vite le sujet.

  6. #6
    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
    Bonjour,

    pour cette recherche de type "lookup", il est intéressant d'utiliser les possibilités d'indexation de noeuds de XSLT. Ainsi, on peut indexer les noeuds <parametre> en prenant comme clé leur fils <nom> avec la balise xsl:key (généralement fille de xsl:stylesheet) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:key name="parametres" match="parametre" use="nom" />
    Il sera possible par la suite de retrouver un noeud indexé dans une expression XPath grâce à la fonction key(indexName', keyValue), qui renvoie la liste des noeuds correspondant à la clé passée en paramètre. Cela simplifie généralement l'écriture des expression XPath, et évite la dégradation des performances qu'entraîne l'utilisation immodérée de //.

    Pour ta dernière question, le noeud courant est bien celui pour lequel le template (ou l'itération d'un for-each) s'exécute. Il est possible de faire référence à ce noeud courant dans une expression XPath avec la fonction current(). Le noeud contextuel lui change au cours de l'évaluation d'une expression XPath, et correspond au noeud servant de contexte pour l'évaluation du reste de l'expression (il est désigné par . ).

    En utilisant ces deux procédés, tu peux te passer de ta variable $nom et écrire ton test de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:if test="key('parametres', current()/@param)/type = 'color'">
    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

  7. #7
    Rédacteur
    Avatar de MasterOfChakhaL
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2004
    Messages
    2 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 147
    Points : 3 264
    Points
    3 264
    Par défaut
    A bah ca...

    C'est exactement le genre de réponse que je n'osais pas espérer:

    -tu réponds parfaitement a mon besoin
    -tu m'otes d'un doute quant aux maniement des XPath
    (2 en 1 c'est plus malin)

    J'étais complétement passé a côté des clé d'indexation et c'est vrai que je vais pouvoir simplifier un bon nombre de xsl

    Bref,
    merci beaucoup
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    N'oubliez pas de cliquer sur quand votre question à trouvé une solution.

    Si vous n'avez pas encore lu les règles du club, mieux vaut tard que jamais!

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 19/04/2016, 18h36
  2. Réponses: 3
    Dernier message: 06/06/2011, 12h56
  3. Update or insert avec conditions sur les champs
    Par calou_33 dans le forum SQL
    Réponses: 7
    Dernier message: 04/08/2010, 10h36
  4. Réponses: 8
    Dernier message: 12/07/2008, 12h29
  5. [XSLT]copie partielle avec condition sur les axes
    Par MasterOfChakhaL dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 13/10/2006, 19h15

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