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 self::attribute [FAQ]


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Par défaut [XPath] test self::attribute
    Bonjour, je voudrais savoir comment tester si le noeud courant est un attribut dont nom est name...
    j ai testé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <xsl:if text="self::@name"/>
    <xsl:if text="self::attribute('name')"/>
    ...mais rien en fonctionne ...

  2. #2
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    C'est parce qu'aucun de ces chemins XPath n'est valide

    en plus c'est test pas text

    essaie ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:if test=".=../@name"/>
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  3. #3
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Par défaut
    pas bête ton idée,
    j'écrirai ceci donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:if test=".= parent::*/@name">
    Merci!!

  4. #4
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Citation Envoyé par Swoög
    C'est parce qu'aucun de ces chemins XPath n'est valide

    en plus c'est test pas text

    essaie ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:if test=".=../@name"/>
    Attention, là tu testes si le contenu du noeud courant est le même que celui d'un attribut name du parent du noeud courant ; c'est un test d'égalité que tu fais, pas un test d'identité.
    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

  5. #5
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Bonjour,

    l'axe self ne te permettra pas de sélectionner un attribut, seul l'axe attribute le peut, mais il ne te sera d'aucune utilité ici. Pour détecter si le noeud contextuel est un attribut, il faut se rappeler une caractéristique fondamentale d'un noeud attribut : son parent est un élément mais il ne fait pas partie des fils de cet élément (voir spécification XPath § 5.3). C'est cette caractérisque qu'il faut tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:if test="count(../*) != count(.|../*) and name() = 'name'">
    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

  6. #6
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Par défaut
    Merci GrandFather effectivement avec la syntaxe précédente j ai un souci car j ai un autre attribut avec la même valeur ce qui pose finalement problème...
    maintenant si j essaie de décoder ce que tu as écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:if test="count(../*) != count(.|../*) and name() = 'name'">
    je n arrive pas à comprendre qu est ce que cela signifie..?

  7. #7
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    comme un attribut n'est pas le fils de son père (c'est super logique jusque là XD)

    tu vas compter tous les fils + l'attribut donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    count(../*) = count(.|../*) + 1
    alors que si c'était un fils, ça serait égale (puisque chaque noeud n'est compté qu'une fois)
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  8. #8
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Par défaut
    Merci,
    cette petite phrase m a bcp aidé
    "puisque chaque noeud n'est compté qu'une fois"
    car sinon effectivement...tout est attribute...
    Merci bcp à vous deux

  9. #9
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Citation Envoyé par Swoög
    comme un attribut n'est pas le fils de son père (c'est super logique jusque là XD)

    tu vas compter tous les fils + l'attribut donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    count(../*) = count(.|../*) + 1
    C'est l'inverse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    count(../*) + 1 = count(.|../*)
    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

  10. #10
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    Citation Envoyé par GrandFather
    C'est l'inverse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    count(../*) + 1 = count(.|../*)
    Oui, désolé... ...

    Bon, je vais me recoucher moi là, on va arretter le massacre
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  11. #11
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Par défaut
    Merci encore pour ces précisions,
    vu que ceci n est pas dans la FAQ je pense que ça vaudrait le coup de l ajouter.
    Faut il poster ta réponse dans le thread correspondant ou pas?
    En tout cas tu devrais le faire car ça manque

    en tout cas merci encore

  12. #12
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    .|../* fait une union entre le noeud courant (qui peut être un attribut ou un élément) et les noeuds fils de son parent (qui ne peuvent être que des éléments).

    De deux choses l'une :
    • le noeud courant est un élément ; cet élément faisant forcément partie des fils de son père, et une union ne pouvant pas renvoyer un nodeset avec des doublons, le test count(../*) != count(.|../*) est faux, les deux parties de l'expression renvoyant le même résultat
    • le noeud courant est un attribut ; ne faisant pas partie des fils de son père, count(.|../*) renverra un résultat différent de count(../*), la différence sera de 1 exactement


    Pour être totalement fiable, il y a encore deux cas qui restent à traiter, le premier est celui où le noeud courant est une instruction de traitement qui porte le même nom que l'attribut dont on veut tester l'identité et qui a le même parent que lui. Il faut donc ajouter une condition au test pour filtrer ce genre de noeud. Le deuxième est celui où le noeud courant est l'élément racine (document element) du document XML, le chemin parent::* renverra un ensemble de noeuds vide, puisque la racine ne peut être atteinte par ce chemin. Si cet élément porte le même nom que l'attribut recherché, il sera considéré à tort comme étant cet attribut. Il faut donc éviter parent::* par et le remplacer par parent::node().

    Cela donne (en remplaçant l'écriture abrégée par l'écriture normale, pour plus de clarté j'espère) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <xsl:if test="count(parent::node()/child::*) != count(self::node()|parent::node()/child::*) 
    and name() = 'name' and not(self::processing-instruction())">
    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

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/07/2010, 15h50
  2. [XPATH] Test sur 2 attributs
    Par robbiano78 dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 09/03/2009, 10h10
  3. [XPATH]Test d'une attribut à ""
    Par tatemilio2 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 15/11/2007, 09h17
  4. [XSL][XPATH] recopier les attributs d un élément mais pas le
    Par Triangle dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 26/08/2005, 16h07
  5. xpath-->test sur les commentaires
    Par yos dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 11/07/2005, 12h14

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