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 :

[XSLT] Texte d'un élément, mais pas de ses enfants


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    56
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Mai 2002
    Messages : 56
    Points : 70
    Points
    70
    Par défaut [XSLT] Texte d'un élément, mais pas de ses enfants
    Salut,

    Dans une feuille XSLT j'ai besoin de récupérer le texte d'un élement qui peut en contenir d'autres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <article att1="..." att2="...">LIBELLE</article>
    mais aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <article att1="..." att2="...">LIBELLE<commentaire>Avec une pancarte Joyeux Anniversaire Léon de 2mx4m</commentaire></article>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <!-- Analyse d'un article au kilo -->
    <xsl:template match="article[att1="..."]">
      <xsl:value-of select="normalize-space(substring(text(),1,24))"/>
    </xsl:template>
    Pour l'instant ce "text()" me renvoie la concaténation du texte de l'élément <article> ET de <commentaire> s'il est présent.

    Comment faire pour ne récupérer, à coup sûr, que le texte de l'élément <article> (ici : LIBELLE) quels que soient les noeuds qu'il peut contenir ?

    Merci d'avance, bien cordialement,

    --
    Pierre Y.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    56
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Mai 2002
    Messages : 56
    Points : 70
    Points
    70
    Par défaut
    Citation Envoyé par PierreY
    <xsl:template match="article[att1="..."]">
    <xsl:value-of select="normalize-space(substring(text(),1,24))"/>
    </xsl:template>

    Pour l'instant ce "text()" me renvoie la concaténation du texte de l'élément <article> ET de <commentaire> s'il est présent.

    Comment faire pour ne récupérer, à coup sûr, que le texte de l'élément <article> (ici : LIBELLE) quels que soient les noeuds qu'il peut contenir ?
    J'ai trouvé, en fait c'est l'application qui utilise ce XML et cette feuille XSLT qui a un problème. J'ai une fonction de nettoyage de ces libellés d'articles qui utilise une requête XPath pour sélectionner les noeuds texte enfants de <article>

    Et en XPath tout seul, la fonction text() renvoie un nodeset avec l'ensemble des noeuds texte du noeud courant, LIBELLE donc mais aussi <commentaire> et si cette fonction est embarquée dans une autre qui renvoie une chaîne (comme la fonction GetValue(XPath: String): String de TXMLCursor alors le contenu du nodeset est transformé en une chaine qui est la concaténation de tous les noeuds de type #text à savoir les contenus texte des noeuds sélectionnés.

    En XSLT, selon qu'on utilise text() dans un <xsl:value-of...> ou dans un <xsl:copy-of...> le résultat est différent.

    Avec <xsl:value-of...>, on est assuré que seul le premier noeud du nodeset renvoyé par text() sera utilisé (LIBELLE) et avec <xsl:copy-of...> on a le même fonctionnement que si XPath était utilisé seul et c'est l'ensemble des noeuds texte qui sont renvoyés.

    La solution dans mon programme a été d'utiliser GetValue('text()[1]') pour ne prendre que le premier noeud du résultat.

    Et voilà :-)

    @ bientôt,

    --
    Pierre Y.

    PS : Ca mériterait pas un petit quelque chose dans la FAQ ça ?

  3. #3
    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
    Citation Envoyé par PierreY
    Et en XPath tout seul, la fonction text() renvoie un nodeset avec l'ensemble des noeuds texte du noeud courant, LIBELLE donc mais aussi <commentaire> et si cette fonction est embarquée dans une autre qui renvoie une chaîne (comme la fonction GetValue(XPath: String): String de TXMLCursor alors le contenu du nodeset est transformé en une chaine qui est la concaténation de tous les noeuds de type #text à savoir les contenus texte des noeuds sélectionnés.
    Ce comportement n'est pas conforme à la spécification XPath 1.0.
    text() est ce qui appelé dans la spécification un node test (comme *), une fonction spéciale qui renvoie true si le noeud évalué est un noeud de type texte. Cette fonction s'utilise avec un axe XPath, qui s'il n'est pas spécifié prend comme valeur par défaut child. child::text() et text() sont donc équivalents. En conséquence, les noeuds texte enfants de <commentaire> ne devraient pas être remontés par ton expression XPath.
    Citation Envoyé par PierreY
    En XSLT, selon qu'on utilise text() dans un <xsl:value-of...> ou dans un <xsl:copy-of...> le résultat est différent.

    Avec <xsl:value-of...>, on est assuré que seul le premier noeud du nodeset renvoyé par text() sera utilisé (LIBELLE) et avec <xsl:copy-of...> on a le même fonctionnement que si XPath était utilisé seul et c'est l'ensemble des noeuds texte qui sont renvoyés.
    value-of en présence d'un node-set ne renvoie que le contenu du premier noeud (le contenu étant la concaténation de tous les noeuds texte du sous-arbre dont ce premier noeud est la racine), et copy-of fait une copie récursive.
    Citation Envoyé par PierreY
    La solution dans mon programme a été d'utiliser GetValue('text()[1]') pour ne prendre que le premier noeud du résultat.
    Je dirait plutôt qu'il y a soit un souci dans ton code, soit une implémentation de XPath mauvaise...

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

Discussions similaires

  1. [MySQL] texte affiché en base mais pas à l'écran
    Par Vince26exe dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 28/08/2013, 18h41
  2. Ajouter du text dans un textarea mais pas à la fin
    Par Mo_Poly dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 16/03/2008, 19h20
  3. desactiver la selection d'un texte (mais pas par onselectstart)
    Par Gzu51 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 10/08/2006, 13h01
  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, 17h07
  5. template match="node() mais pas text()"
    Par Manu_Just dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 26/03/2003, 11h52

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