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 :

Jointures avec Xpath sous Matlab [XPATH 2.0]


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 13
    Points : 12
    Points
    12
    Par défaut Jointures avec Xpath sous Matlab
    Bonjour,

    J'utilise XPath 2.0 (j'ai testé avec la fonction current-date() sans argument pour le vérifier).
    Je tente de faire une jointure avec le fichier XML ayant 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
    13
    14
    15
    16
    17
    18
    <node id="2968371377" visible="true" version="1" changeset="24213464" timestamp="2014-07-18T04:51:05Z" user="ecdos" uid="762684" lat="48.1405217" lon="16.0331804"/>
     <node id="2968371384" visible="true" version="1" changeset="24213464" timestamp="2014-07-18T04:51:05Z" user="ecdos" uid="762684" lat="48.1405617" lon="16.0332849"/>
     <way id="293258470" visible="true" version="1" changeset="24213464" timestamp="2014-07-18T04:51:11Z" user="ecdos" uid="762684">
      <nd ref="2968371376"/>
      <nd ref="2968371377"/>
      <nd ref="2968371373"/>
      <nd ref="2968371371"/>
      <nd ref="2968371376"/>
      <tag k="busg" v="yes"/>
     </way>
     <way id="293258502" visible="true" version="1" changeset="24213464" timestamp="2014-07-18T04:51:13Z" user="ecdos" uid="762684">
      <nd ref="2968371383"/>
      <nd ref="2968371384"/>
      <nd ref="2968371379"/>
      <nd ref="2968371378"/>
      <nd ref="2968371383"/>
      <tag k="building" v="yes"/>
     </way>
    Je souhaite afficher la latitude et la longitude des nodes étant :
    1- dans un way
    2- dans un way ayant un tag de valeur building

    Avec les éléments ci-dessus : ma requête ne doit renvoyer que les coordonnées du point d'id 2968371384, pas les autres (et pas 2968371377).


    J'ai essayé la requête suivante pour la latitude seulement (la longitude c'est pareil) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /node[../way/tag[@k="building"] and ../way/nd/@ref=./@id]/@lat
    ça me renvoi les coordonnées de l'id 2968371384 et de l'id 2968371377.


    A noter que je ne souhaite faire qu'une seule requête XPATH car je peux aussi faire des boucles imbriquées dans Matlab avec des appels de requête mais c'est trop lent pour de gros fichiers.


    Merci pour votre aide

  2. #2
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Ceci identifie les nodes...
    Code xpath : Sélectionner tout - Visualiser dans une fenêtre à part
    //node[@id=following-sibling::way[tag/@k='building']/(nd/@ref)]
    Après vous pouvez sortir ses attributes via @lat et @lon. Si sortir directement comme séquence est plus commode, on peut faire ça.
    Code xpath : Sélectionner tout - Visualiser dans une fenêtre à part
    //node[@id=following-sibling::way[tag/@k='building']/(nd/@ref)]/(@lat, @lon)

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 13
    Points : 12
    Points
    12
    Par défaut
    Merci tsuji . J'ai testé ça semble fonctionner à merveille !

    Je n'ai pas bien compris comment fonctionne following-sibling mis à part que ça sélectionne les nœuds d'après... Est-ce une forme d'optimisation pour éviter de reparser tout le document lors de la jointure ?

    Merci encore tsuji pour la pertinence de ta réponse ainsi que pour ta réactivité.

  4. #4
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Bonjour, l'axe semble bien fondamental que tu vas avoir la chance de familiaier sans doute à venir. L'emploie de ../ que tu prends n'est pas bien loins; avec following-sibling:: n'est que un peu plus dépouillé, en fait pas un grand élan de difficulté. Grosso mode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ../* = preceding-sibling::* + noeud en contexte + following-sibling::*
    Une syntaxe proprement xslt 2 utilisée centrale est de l'arithmétique de comparison existentiale, l'équalité = se comporte comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "x" = ("a", "b", "w", "x", "y") => true
    qui rends la recheche de match @id et nd/@ref bien plus facile.

    A part ça, la séquence se situe au centre de xslt 2.0, mais c'est bien entendu, à peine besoins de faire mentionner. Voilà !

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 13
    Points : 12
    Points
    12
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ../* = preceding-sibling::* + noeud en contexte + following-sibling::*
    Ok super merci


  6. #6
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 13
    Points : 12
    Points
    12
    Par défaut
    Bonjour,



    En fait, j'ai un autre problème pour le traitement des données après. Je souhaite avoir tous les node - ce qui est déjà le cas -, ainsi que récupérer pour chaque node l'id du way. Faire une sorte de group by avec les way.
    1- Est-ce possible de le faire avec une seule requête XPath ?

    Ce que je pensais faire au début c'était recoller tout ça avec une autre requête en parallèle qui compte le nombre de node par way, afin de retrouver l'indice.
    Le problème c'est que certains node sont dans plusieurs way ! Au lieu de me renvoyer les node, même lorsqu'ils sont en doublon, cela me renvoi que les node distincts, du coup cela décale tout dès qu'un même node est retrouvé dans un autre way (il ne réapparait pas) !
    2- (Sinon) peut-on autoriser de retourner des node plusieurs fois ?

    3- (Ou alors) est-ce que finalement XSLT c'est pas plus approprié ? -> on créé un fichier XML temporaire idéal pour pouvoir retourner tous les node et leur id ?

  7. #7
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Je ne suis évidemment pas dans une position de savoir toute l'amplitude de ce que tu veux faire sortir de par le document xml original. Mais si mathlab supporte bien xslt - et il me semble bien c'est le cas - c'est le chemin xslt qu'on doit prendre pour le confort autant que pour la flexibilité extensible. Pourtant, je ne vois la nécessité de créer un xml intémediaire physique : on questionne le xml original via un xslt et il répond de suite fidèlement et c'est tout.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 13
    Points : 12
    Points
    12
    Par défaut
    ok je vais partir sur xslt je pense que ce sera plus simple.
    Oui effectivement on peut zaper le fichier intermédiaire, je regarderai sur matlab si on peut le faire sans fichier XML intermédiaire.


    Merci tsuji

    maintenant j'arrête d'assassiner le forum avec mes questions

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

Discussions similaires

  1. Ouvrir volume créé avec CAO sous matlab
    Par cedji dans le forum Images
    Réponses: 4
    Dernier message: 02/08/2011, 13h56
  2. jointure avec sous jointure optimisé
    Par gtraxx dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/01/2011, 19h00
  3. récupérer une sous arbre XML avec Xpath
    Par imen1986 dans le forum APIs
    Réponses: 2
    Dernier message: 20/05/2010, 20h04
  4. Réponses: 8
    Dernier message: 28/10/2008, 14h00

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