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] recuperation nom balise suivante


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 181
    Points : 70
    Points
    70
    Par défaut [XPath] recuperation nom balise suivante
    Bonjour à tous,
    Je souhaiterais savoir si il existe une instruction ou un moyen pour récupérer le nom de la balise qui suit la balise lue.
    Exemple : je lis une balise <sport> j'aimerai savoir si il est possible de connaitre le nom de la balise qui suivra. si il s'agit de <nom>Tennis</nom> j'aimerai récupéré : "nom".

    Cela est il possible?
    Merci d'avance

  2. #2
    Membre éprouvé Avatar de alain.couthures
    Profil pro
    Gérant
    Inscrit en
    Avril 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Avril 2007
    Messages : 902
    Points : 1 247
    Points
    1 247
    Par défaut
    L'expression XPath pour faire cela est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    name(following-sibling::*[1])
    Pouvez-vous fournir un exemple significatif ?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 181
    Points : 70
    Points
    70
    Par défaut
    exemple de fichier xml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ....
    <sport>
    <nom>Tennis</nom>
    <joueurs>2</joueurs>
    </sport>
     
    <sport>
    <lieu>stade</lieu>
    </sport>
    ...
    j'ai donc crée un xsl pour mettre en forme l'ensemble de mon xml.
    et je cherchais donc une expression xpath pour afficher (dans ce cas present) la balise qui suit <sport> soit : nom et lieu ici.

  4. #4
    Membre éprouvé Avatar de alain.couthures
    Profil pro
    Gérant
    Inscrit en
    Avril 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Avril 2007
    Messages : 902
    Points : 1 247
    Points
    1 247
    Par défaut
    A proprement parler la balise <nom> ne suit pas la balise <sport> car elle est sa première fille d'où

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 181
    Points : 70
    Points
    70
    Par défaut
    je vois je vois ca m'aide beaucoup en effet merci de ton aide
    par contre je suis debutant et je me perds un peu au niveau des recuperations d'informations des balises. Je vois tres bien comment on peut utiliser name(*[1]). Cependant imaginons la structure suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ....
    <sport>
           <infos>       
                <nom>Tennis</nom>
                <joueurs>2</joueurs>
          </infos>
    </sport>
     
    <sport>
           <lieu>stade</lieu>
    </sport>
    ...
    comment puis je acceder à nom, joueurs et aux deux valeurs : tennis et 2?

  6. #6
    Membre éprouvé Avatar de alain.couthures
    Profil pro
    Gérant
    Inscrit en
    Avril 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Avril 2007
    Messages : 902
    Points : 1 247
    Points
    1 247
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    descendant::*[text() != '']
    va permettre de pointer, depuis la balise <sport>, tour à tour les balises <nom> et <joueur> dont on récupèrera le nom par name() et le contenu par text()

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 181
    Points : 70
    Points
    70
    Par défaut
    impeccable en effet cela fonctionne parfaitement. j'ai juste remarqué quelque chose, si je marque deux noms :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <nom>football</nom>
    <nom>foot</nom>
    Cela ne va me recuperer que le premier si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    descendant::*[name() = 'nom']
    est ce normal?

    de plus si j'ai une autre balise dans mon xml qui s'appelle nom elle va toujours recuperer le premier nom aurais tu une idée? par exemple pour preciser à partir de quelle balise on rechercherait le nom? ici preciser qu'on commence à chercher une balise nom à partir de <sport>. j'ai testé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    descendant::sport[name() != '']
    ce qui me renvoit bien tout ce qui est contenu dans <sport> mais cela ne me renvoit rien si je tape :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    descendant::sport[name() = 'nom']
    désolé de ces deux dernières questions

  8. #8
    Membre éprouvé Avatar de alain.couthures
    Profil pro
    Gérant
    Inscrit en
    Avril 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Avril 2007
    Messages : 902
    Points : 1 247
    Points
    1 247
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    descendant::*[name() = 'nom']
    est identique àCe qui explique que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    descendant::sport[name() = 'nom']
    ne retourne rien alors que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    descendant::sport[name() != '']
    retourne un élément <sport>
    Enfin, lorsque l'on demande le contenu textuel d'un élement qui en contient d'autres, on obtient la concaténation de tous les contenus textuels des sous-éléments.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 181
    Points : 70
    Points
    70
    Par défaut
    je vois cependant concernant mes deux problemes je ne sais pas trop comment proceder alors. Auriez vous une idée?

    je pense qu'il faut toujours conserver l'utilisation de descendant mais apres je me perds rapidement.

  10. #10
    Membre éprouvé Avatar de alain.couthures
    Profil pro
    Gérant
    Inscrit en
    Avril 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Avril 2007
    Messages : 902
    Points : 1 247
    Points
    1 247
    Par défaut
    descendant::nom correspond à la liste des éléments nom qui sont descendants mais selon le contexte seul le premier est pris en compte, par exemple quand on en demande le contenu. descendant::nom[1] est le premier de la liste; descendant::nom[2] le second ... et descendant::nom[last()] le dernier

    Il est cependant possible de faire une boucle sur chacun et de concaténer les contenus.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <xsl:variable name="lesnoms">
     <xsl:for-each select="descendant::nom">
       <xsl:value-of select="."/>
       <xsl:if test="position() != last()">
         <xsl:text> </xsl:text>
       </xsl:if>
     </xsl:for-each>
    </xsl:variable>

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 181
    Points : 70
    Points
    70
    Par défaut
    impeccable
    je tenais à te dire un grand merci pour ton aide qui m'a été très précieuse. Cela fait plaisir de voir l'entraide des "experts" pour les débutants.

    Merci encore

    dernière petite question dont je ne connais pas la réponse :
    imaginons dans le pire des cas dans mon fichier xml on ait :
    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
     
    ....
    <sport>
           <infos>       
                <nom>Tennis</nom>
                <joueurs>2</joueurs>
          </infos>
    </sport>
     
    <sport>
           <lieu>stade</lieu>
    </sport>
    ...
     
    <nom>Toto</nom>
    existe t il un moyen de preciser si on souhaite récuperer le nom correspondant à tennis ou bien le nom Toto?

    mon problème est resolu mais c'est une question que je me pose malgré tout.

  12. #12
    Membre éprouvé Avatar de alain.couthures
    Profil pro
    Gérant
    Inscrit en
    Avril 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Avril 2007
    Messages : 902
    Points : 1 247
    Points
    1 247
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    name(descendant::*[text() = 'tennis'])
    On peut y rajouter un passage en lettres minuscules avec la fonction translate() mais c'est un peu lourd car il faut lui dire que 'A' devient 'a', 'B' devient 'b',...

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 181
    Points : 70
    Points
    70
    Par défaut
    oui je n'utilise que tres peu la fonction translate, sauf si j'y suis obligé.

    En fait ce que je voulais dire c'est si j'utilise ton code pour recuperer tous les noms cela va me recuperer Tennis et Toto. Or si je veux récupérer seulement la seconde (Toto) existe t il un moyen? Imaginons que je ne connaisse (car ton exemple suppose qu'on connaisse la valeur Toto mais je ne peux pas faire ca si j'ai 50 noms dans mon fichiers xml) pas sa valeur et que je souhaite recuperer la valeur contenue dans <nom> mais qui ne sois pas dans <sport> comme dans l'exemple.

    J'ai beau chercher je ne vois pas trop.

  14. #14
    Membre éprouvé Avatar de alain.couthures
    Profil pro
    Gérant
    Inscrit en
    Avril 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Avril 2007
    Messages : 902
    Points : 1 247
    Points
    1 247
    Par défaut
    Tout dépend d'où l'on est quand on exécute l'expression XPath...
    Pour avoir tous les <nom> en dessous d'un <sport> quand on est à la racine, on peut utiliseret pour ne pas les avoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //nom[not(ancestor::sport)]

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 181
    Points : 70
    Points
    70
    Par défaut
    nickel merci pour toute ton aide

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

Discussions similaires

  1. [XSLT][XPATH] recuperer une donnée d'une autre balise via un id
    Par wylenia dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 26/11/2010, 08h32
  2. recuperer nom balise XML
    Par Mickael2604 dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 19/03/2010, 14h34
  3. [débutante] doublon de nom balise possible ?
    Par anitshka dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 04/08/2005, 16h54
  4. Réponses: 2
    Dernier message: 12/01/2005, 10h18
  5. [web] récupérer nom du serveur
    Par GMI3 dans le forum Web
    Réponses: 4
    Dernier message: 24/09/2003, 14h10

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