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] « Points flottants » ailleurs qu'à la racine ? [FAQ]


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Inactif Avatar de Hibou57
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    852
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 852
    Par défaut [XPath] « Points flottants » ailleurs qu'à la racine ?
    Re-Bonsoir,

    Avec XPath, il est possible de faire ce que j'appel (pardon, je ne connais pas le terme exacte) un point flottant à la racine d'un chemin. Cela est comparable au '*' que l'on trouve dans certaine forme d'expression régulière (comme les RegEx du genre de DOS).

    Par exemple :
    Code XPath : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    //renvoie/lien
    peut vérifier (to match) aussi bien le chemin /document/chapitre/paragraphe/renvoie/lien que /document/references/renvoie/lien

    Je me demande s'il est légale d'emploie un tel « // » ailleur qu'à la racine, comme en faisant par exemple :
    Cette expression pourrait alors vérifier un chemin comme /truc/a/b/machin/chose/c ou /bidule/a/b/c ou même encore /a/b/c

    Si quelqu'un(e) en sait quelque chose ...

    Re-Bonne nuit

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

    c'est tout à fait possible, tout comme il est possible d'utiliser cette expression en partant du noeud courant :
    En fait, // est l'abbréviation de /descendant-or-self::node()/

    Deux choses à savoir concernant cette expression : elle consomme beaucoup de ressources quand elle est employée sur des structures XML complexes et profondes, et elle doit être utilisée avec précaution quand elle est combinée avec des prédicats de position du type //a[1].

    Pour comprendre ce deuxième point, qui constitue une source d'erreur courante, voyons un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <a>
        <b>
            <c>1</c>
            <c>2</c>
            <c>3</c>                
        </b>
        <b>
            <c>4</c>
            <c>5</c>
            <c>6</c>                    
        </b>
    </a>
    On pourrait s'attendre à ce que //c[1] nous sélectionne ceci :
    En fait, L'expression XPath va sélectionner ceci :
    Ce résultat, a priori étonnant, s'explique facilement quand on substitue l'expression XPath complète à son raccourci // : sont sélectionnés les éléments c qui sont les premiers fils d'éléments descendants de la racine. Pour ne sélectionner que <c>1</c>, il faut utiliser cette expression :
    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
    Inactif Avatar de Hibou57
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    852
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 852
    Par défaut
    Citation Envoyé par GrandFather
    Bonjour,
    En fait, // est l'abbréviation de /descendant-or-self::node()/
    C'est un description formelle, qui en gros dit que dans ...A//B..., partant d'un noeud A sur un chemin, il peut se trouver n'importe qu'elle chaîne de noeud menant au noeud B, pour peu que le noeud A soit un encêtre de B ou le noeud B lui-même (dans ce cas, la chaîne de neoud menant à B est vide). Cela correspond donc bien à la notion de '*' des expressions régulières, qui correspond à une chaîne de n'importe quelle longueur, y compris éventuellement vide. Je ne sais pas pourquoi, je trouve que ça s'exprime mieux comme ça (avis subjectif).

    Donc tu me dis que c'est autorisé Bonne nouvelle, ça m'arrange bien (dans les tutos du W3C, on ne voit ça qu'à racine pourtant)

    Citation Envoyé par GrandFather
    On pourrait s'attendre à ce que //c[1] nous sélectionne ceci :
    En fait, L'expression XPath va sélectionner ceci :
    Oui, bien, c'est tout à fait logique, puisque si on pense en terme d'expression régulière, des deux chemins a/b[1]/c[1] et a/b[2]/c[1] vérifie l'expression régulière. Car il ne faut pas oublier qu'une selection, renvoie un ensemble de noeud, et non pas un noeud unique (même si l'ensemble peut contenir un seul noeud, comme cela se produit le plus souvent), et il faut donc toujours penser en terme de « tout les éléments qui vérifient ce pattern ». Et si dans notre esprit, un pattern est fait pour ne selectionner qu'un seul neoud, alors il faut s'assurer que logiquement il ne peut selectionner qu'un noeud et un seul (un ensemble de un noeud seulement).

    Je comprend que ce soit gourmand en resource : mais c'est le cas seulement lorsque que ce type de pattern est employé en requête. Dans mon cas (mais ta remarque interessait les autres aussi), car le programme n'appliquera qu'à un seul chemin donné à la fois, pour controler si oui ou non il correspond à un pattern donné, et cela ne produira donc pas d'exploration de tout le document tout entier.

    Merci encore GrandFather (t'es partout, pas étonnant que je t'ai même vu dans les défis XML )

Discussions similaires

  1. Exception en point flottant (core dumped)
    Par Shakto dans le forum Débuter
    Réponses: 2
    Dernier message: 23/11/2012, 22h23
  2. Avoir une application web ailleurs qu'à la racine du serveur ?
    Par khayyam90 dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 24/03/2011, 13h37
  3. [XPath] des point dans une chaine de caracteres
    Par Smix007 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 08/04/2010, 22h45
  4. [XPATH] Position d'un noeud par rapport à la racine ?
    Par DemonKN dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 22/10/2008, 18h51
  5. Erreur en point flottant
    Par KaNDeL dans le forum Débuter
    Réponses: 4
    Dernier message: 21/10/2008, 17h40

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