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

XQUERY/SGBD XML Discussion :

[XPath/XQuery/XPointer] Recherche fonction


Sujet :

XQUERY/SGBD XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 32
    Par défaut [XPath/XQuery/XPointer] Recherche fonction
    Bonjour à tous,

    Je recherche une fonction (ou une combinaison de fonctions) XPath/XQuery qui, étant donné un nœud/variable sélectionné via un prédicat XPath, retourne la localisation XPointer sous la forme d'une chaîne de caractères.

    Avec un exemple, ce sera sans doute plus clair.

    Soit le document XML suivant -- appelons-le exemple.xml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <exemples>
      <exemple>toto</exemple>
      <exemple>titi</exemple>
    <exemples>
    Soit la requête XQuery suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    let $doc := doc("exemple.xml") return (: charge le document "exemple.xml" :)
    for $var in $doc/exemples/exemple return (: sélectionne les noeuds "exemple" :)
    <pointeur>{ICI_LA_FONCTION_RECHERCHÉE($var)}</pointeur> (: retourne la localisation des noeuds sélectionnés :)
    Ce qui nous donnerait la sortie que voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <pointeur>/exemples[1]/exemple[1]</pointeur>
    <pointeur>/exemples[1]/exemple[2]</pointeur>
    Je n'ai malheureusement pas trouvé ce qu'il me faut dans les spécifications W3C.

    Merci d'avance.

  2. #2
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 32
    Par défaut
    Re-bonjour,

    En bricolant un peu avec les fonctions xpath/xquery, j'ai réussi à pondre une solution provisoire (mais peu efficace).

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    xquery version "1.0";
     
    declare function local:xposition($arg as node()) as xs:string
    {
      if (fn:root($arg) eq $arg)
        then    
        {
          fn:concat("/",fn:string(fn:node-name($arg)),"[1]")
        }
      else
        {fn:concat(
          local:xposition($arg/parent::node()),
          "/",
          fn:string(fn:node-name($arg)),
          "[",
          fn:string(count($arg/preceding-sibling::*)+1),
          "]"
    	)}
    };
     
    let $doc := doc("exemple.xml") return
    for $var in $doc/exemples/exemple return
    <pointeur>{local:xposition($var)}</pointeur>
    La ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fn:string(count($arg/preceding-sibling::*)+1),
    me donne la position du nœud courant par rapport à ses frères aînés. Je me suis inspiré d'un bout de code trouvé ici-même : http://www.developpez.net/forums/d27...ent/#post16679

    Mais appeler plusieurs dizaines de fois "count($arg/preceding-sibling::*)" me semble largement inefficace.

    En fait, il y a une fonction "position()" fournie par xpath, mais je n'arrive pas à me dépatouiller avec pour obtenir la position relative d'un nœud par rapport aux frères aînés ayant le même nom (à chaque fois, j'obtiens 1). Comment utiliser cette fonction pour obtenir le bon résultat ?

    Merci.

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

    je ne connais malheureusement pas assez XQuery pour t'être d'une aide efficace, par contre j'avais écrit une petite classe Java qui le faisait : http://java.developpez.com/sources/?page=xml#XPathUtils

    En espérant que ça te soit utile...
    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

  4. #4
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 32
    Par défaut
    Merci pour ta réponse.

    Cela dit, je ne travaille pas avec Java sur ce problème.

    Dans mon précédent post, il y a une petite erreur. La fonction "count($arg/preceding-sibling::*)+1" permet de calculer la position du nœud $arg relativement à TOUS ses frères aînés. Donc si mon entrée XML est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <exemples>
      <exemple>toto</exemple>
      <rien/>
      <exemple>titi</exemple>
    </exemples>
    ma sortie sera :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <pointeur>/exemples[1]/exemple[1]</pointeur>
    <pointeur>/exemples[1]/exemple[3]</pointeur>
    Or, ce qu'il faut en réalité pour récupérer le pointeur, c'est compter le nombre de frères aînés ayant le même nom.

    Pour l'instant, je n'ai pas trouvé comment le faire...

  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
    Citation Envoyé par Jeddo Voir le message
    Or, ce qu'il faut en réalité pour récupérer le pointeur, c'est compter le nombre de frères aînés ayant le même nom.
    Avec ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    count($arg/preceding-sibling::*[name() = name($arg)])+1
    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 averti
    Inscrit en
    Avril 2005
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 32
    Par défaut
    Citation Envoyé par GrandFather Voir le message
    Avec ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    count($arg/preceding-sibling::*[name() = name($arg)])+1
    Eh bien, avec ceci, ça fonctionne !

    Effectivement, il fallait filtrer avec name($arg), mais je ne trouvais pas comment faire. Merci beaucoup.

    Je laisse néanmoins le sujet en suspens, si quelqu'un voyait une solution plus efficace pour connaître la position d'un nœud-élément relativement à ses frères aînés du même noms.

Discussions similaires

  1. recherche fonction equivalente a goto ligne 12 en php
    Par carmen256 dans le forum Langage
    Réponses: 2
    Dernier message: 16/03/2006, 22h34
  2. recherche fonction java
    Par amel2006 dans le forum Langage
    Réponses: 3
    Dernier message: 01/03/2006, 16h02
  3. [PL/SQL - PAIR/IMPAIR] Recherche fonction
    Par shaun_the_sheep dans le forum Oracle
    Réponses: 3
    Dernier message: 06/02/2006, 14h47
  4. [GD] recherche fonction de création d'images miniatures
    Par digger dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 18/11/2005, 21h12
  5. Recherche fonctions rendant la valeur
    Par Bertrand_Collet dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 26/11/2002, 12h05

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