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] Problème de sélection de noeuds


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2006
    Messages : 33
    Points : 32
    Points
    32
    Par défaut [XPath] Problème de sélection de noeuds
    Bonjour,

    Etant un peu expérimenté mais pas expert de XPath, je me prend la tête sur une petite chose : la fameuse formule magique qui va me permettre d'obtenir ce qu'il me faut de mon fichier XML.

    Le voici :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <texts>
     <text id="mnuCalendar">
      <language lang="FR">Calendrier</language> 
      <language lang="NL">Kalender</language> 
     </text>
     <text id="mnuLinks">
      <language lang="FR">Liens</language> 
      <language lang="NL">Links</language> 
     </text>
    </texts>
    On aura vite compris qu'il s'agit d'un fichier contenant les traductions de certaines parties de pages web.

    Le contexte est le PHP mais ca importe peu ici. J'ai fait une fonction qui lit ce fichier et retourne un tableau avec comme clé ceci : <text id="mnuLinks"> et comme valeur, le contenu du noeud "language" correspondant à la langue choisie.

    Je voudrais récupérer par exemple le fichier suivant :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <texts>
     <text id="mnuCalendar">
      <language lang="FR">Calendrier</language> 
     </text>
     <text id="mnuLinks">
      <language lang="FR">Liens</language> 
     </text>
    </texts>

    ... si l'utilisateur est francophone.

    Ce qui m'occupe est donc de pouvoir récupérer tous les noeuds <text> et le noeud qu'ils contiennent dont l'attribut "lang" est égal à true.

    J'ai testé sans succès l'expression " /text/language[@lang="FR"] " mais visiblement c'est pas ca...

    J'ai aussi essayé avec le prédicat "descendant-or-self" mais j'ai du mal m'y prendre car j'ai une forte impression que tous les éléments ci-dessus sont susceptibles de ne pas être loins de la réponse.

    Quelqu'un aurait-il une idée ?

    Merci d'avance !

    Heriquet

  2. #2
    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,

    il y a un petit souci : une sélection XPath te renverra une liste de noeuds, pas une structure arborescente que tu pourras parcourir avec DOM. Si tu souhaites récupérer un arbre XML qui filtre des noeuds selon leur langage, il faudra passer par une transformation XSLT.

    Maintenant, si tu veux récupérer par XPath la version française de la chaîne 'mnuLinks', utilise l'expression :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /texts/text[@id='mnuLinks']/language[@lang='FR']
    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

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2006
    Messages : 33
    Points : 32
    Points
    32
    Par défaut
    En fait, je veux récupérer un arbre qui contient les "text" et uniquement leur traduction en francais, le reste étant géré par un array en php.

    J'ai une fonction qui me renvoi un tableau avec TOUS les "text", et je vas y chercher la valeur qui correspond à l'ID du noeud "text".

    Je suppose que dans ce cas je dois utiliser l'expression suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    /texts/text/language[@lang='FR']
    je ne saurais pas essayer maintenant mais je vais tenter de le faire dès ce soir.

    Merci à toi.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2006
    Messages : 33
    Points : 32
    Points
    32
    Par défaut
    Je viens d'essayer avec Stylus Studio (bien fait ce soft sans vouloir faire de pub) et les 2 requetes apportent les résultats escomptés.

    Je teste ca sur mon applic ce soir et je donne des nouvelles pour éventuellement cloturer ce forum.

    Encore merci...

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2006
    Messages : 33
    Points : 32
    Points
    32
    Par défaut
    Ca ne fonctionne pas sur l'applic...

    J'ai bel et bien besoin de l'arborescence ci-dessus.

    J'imagine que je vais devoir créer une sous-arborescence avec XSLT à partir de mon fichier XML de base... on verra pour l'optimisation !

    Quoi qu'il arrive je mettrai la soluce sur le forum, tout en étant surpris qu'il soit pas possible de réaliser la requete voulue...

    a+

  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
    Citation Envoyé par Heriquet
    Quoi qu'il arrive je mettrai la soluce sur le forum, tout en étant surpris qu'il soit pas possible de réaliser la requete voulue...
    Citation Envoyé par GrandFather
    il y a un petit souci : une sélection XPath te renverra une liste de noeuds, pas une structure arborescente que tu pourras parcourir avec DOM. Si tu souhaites récupérer un arbre XML qui filtre des noeuds selon leur langage, il faudra passer par une transformation XSLT.
    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. [XPath] Problème de sélection de valeur XML
    Par pitipilot dans le forum C#
    Réponses: 0
    Dernier message: 10/10/2014, 16h18
  2. Réponses: 3
    Dernier message: 06/04/2007, 15h32
  3. [Xpath] Sélection des noeuds dont un attribut
    Par toxine dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 29/01/2007, 14h22
  4. [DOM] Problème de sélection de noeuds
    Par SimOOn dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 22/10/2006, 17h13
  5. [XPath] Problème de sélection
    Par zserdtfg dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 22/09/2006, 14h57

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