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 :

Faire une recherche XPATH sur deux chemins différents


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Faire une recherche XPATH sur deux chemins différents
    Bonjour,

    Je cherche à faire une recherche, en php sur deux xpath différents.

    Les communes se trouvent ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /ead/archdesc/dsc////controlaccess/geogname
    Les nom se trouvent ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /ead/archdesc/dsc/c/c/controlaccess/persname
    En php, je fait une recherche via :
    avec la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $xpath_geog = "//controlaccess/geogname";
    $xpath_pers = "//controlaccess/persname";
    $valeur_geog = "Paris";
    $valeur_pers = "Toto";
    $req = $req.= sprintf("//ead/archdesc/dsc//c[%s=\"%s\"]",{xpath_geog|xpath_pers},{valeur_geog|valeur_pers});
    Ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //ead/archdesc/dsc//c[controlaccess/geogname="Paris"] 
    //ead/archdesc/dsc//c[controlaccess/persname="Toto"]
    Pour les noms, ça fonctionne très bien. Mais pour les communes, je n'ai aucun résultat.

    J'ai tenté d'ajouter des /// (1,2,3,..) mélangé à des "c" mais rien n'y fait.
    Je n'arrive pas à un résultat correcte.
    Sachant que j'aimerai ne pas changer la première partie du sprintf {sprintf("//ead/archdesc/dsc//c} car c'est commun à plusieurs autre code/clients, comment faire ?
    Ou si je dois forcement changer la partie en dur, merci de me dire quel chemin dois-je mettre pour que les deux recherche fonctionne.
    Je m'adapterai pour les autres clients en classe Extends.

    D'avance merci à la communauté.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Hello,

    PHP n'est pas franchement ma tasse de thé, mais si tu veux des réponses générales sur XPath :

    - Euh... XPath s'utilise un à la fois. Pas plusieurs chemins à la fois -_-°. L'idée habituelle serait de chercher d'abord l'un, ensuite l'autre. Ça marche incroyablement bien.

    - Si on veut quand même chercher avec un seul chemin plusieurs trucs qui n'ont rien à voir, on utilise le OU qui se note |
    par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //ead/archdesc/dsc//c[controlaccess/geogname="Paris"] | //ead/archdesc/dsc//c[controlaccess/persname="Toto"]
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    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 sais quoi, les quatre /'s, mais, en tout cas, je suggérais replacer
    [%s=\"%s\"]
    par
    Code text : Sélectionner tout - Visualiser dans une fenêtre à part
    [normalize-space(%s)=\"%s\"]

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Merci déjà d'avoir jeté un oeil et tenté de m'aider.

    @thelvin : Ce n'est pas que je souhaite faire une recherche unique sur deux champs en même temps, c'est qu'en php, je boucle sur les deux champs, pour faire la recherche, un coup, pour les noms ça fonctionne, le second coup, avec la même requête, ça ne fonctionne pas.

    @tsuji : les multiples '/' servent à faire une recherche du 1er au 4ème niveau. Car j'ai des données geogname au 1er et 4eme niveau.
    Mais normalize-space() m'a permis de passer une nouvelle étape, j'ai à nouveau des résultats, mais pas ceux voulus.. Je pense que là c'est un soucis de données par rapport aux niveaux.

    Merci de vos aides.
    Je continue mes recherches, mais ça m'a déjà bien aidé.

  5. #5
    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
    ... les multiples '/' servent à faire une recherche du 1er au 4ème niveau.
    Oui, on pourrait penser comme ça, mais ce n'est pas ce que xpath l'entend. // veut dire les descendants, mais //// ce n'est pas très xpath du tout. Si vous voulez exactement quatre niveaux dessous, c'est peut-être ./*/*/*/*. Je vous laisse de lire la documentation sur la notion d'axis.

    Et puis, je vous laisse de se corriger les erreurs de syntax sur sprintf. Je vais prendre une version réduire pour parler des issues de xml propre.

    Il faut absolument mettre le noeud de contexte explicit dans le prédicat si vous entendez les déscendants de la balise c. Je ne prends qu'un par un.
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $xpath_geog = ".//controlaccess/geogname";    //avec un dot devant pour signifier le contexte
    $xpath_pers = ".//controlaccess/persname";
    $valeur_geog = "Paris";
    $valeur_pers = "Toto";
    $req = sprintf("//ead/archdesc/dsc/c/c[normalize-space(%s)=\"%s\"]",$xpath_geog,$valeur_geog);
    Si c'est sur controlaccess est un enfant direct de c à la deuxième niveau, on met simplement :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $xpath_geog = "controlaccess/geogname";
    $xpath_pers = "controlaccess/persname";

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Merci de votre aide.

    mon exemple avec le sprintf était pragmatique. Histoire de vous montrer ce que je voulais faire.

    J'ai pu, grâce à chacun d'entre vous trouver une solution qui fonctionne sans soucis et sans tout déformer.

    Voilà un peu à quoi cela ressemble :

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <facettes label="Résultats" largeur="250" position="droite">
            <entree>
                <label>Commune</label>
                <xpath>//controlaccess/geogname</xpath>
                <xpath_query>/ead/archdesc/dsc/c[normalize-space(controlaccess/geogname)="valeur"] | /ead/archdesc/dsc/c/c[normalize-space(controlaccess/geogname)="valeur"]</xpath_query>
            </entree>
            <entree>
                <label>Notaires</label>
                <xpath>//controlaccess/persname</xpath>
            </entree>
        </facettes>

    Et le php :

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    foreach ($data['val'] as $k=>$v){ //pour chaque valeur renseignée
    		if ($this->_tabFacette['entrees'][$id]['xpath_query']){ //Si xpath_query est renseigné dans le XML des facettes
    		$req = str_replace('valeur',str_replace('"'," ",utf8_encode($v)),$this->_tabFacette['entrees'][$id]['xpath_query']);
    	}
    	else{ //Sinon
    		$req = sprintf("//ead/archdesc/dsc//c[%s=\"%s\"]",str_replace('//','',$this->_tabFacette['entrees'][$id]['xpath']),str_replace('"'," ",utf8_encode($v)));
    	}
    }

    Merci encore.

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

Discussions similaires

  1. Comment faire une condition sur deux lignes différentes ?
    Par sogelinas dans le forum SAS Base
    Réponses: 4
    Dernier message: 08/10/2014, 03h33
  2. Faire une recherche de type "contient" sur deux colonnes
    Par Sango64 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 05/08/2011, 10h20
  3. Réponses: 19
    Dernier message: 12/04/2007, 15h11
  4. Réponses: 3
    Dernier message: 08/09/2006, 18h00
  5. Réponses: 4
    Dernier message: 02/06/2006, 16h30

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