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] chemin avec critères spécifiques


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2005
    Messages : 135
    Par défaut [XPath] chemin avec critères spécifiques
    Bonjour à tous,

    Je sais le sujet n'est pas très explicite.

    Je travaille avec des fichiers word2003 (xml) et je cherche à stocker la liste des tous les noeuds représentant les lignes de tous les tableaux.

    ça me donne :
    maintenant je désirerais savoir s'il existe un moyen de récupérer chaque ligne dont la premiere case commence par toto sachant que pour récupérer la premiere case c'est le XPath suivant :

    Je vous remercie !!!

    Loic

  2. #2
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //w:tbl/w:tr/w:tc[1][ starts-with(.,'toto')]

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2005
    Messages : 135
    Par défaut
    clair, concis, rapide !

    Par contre comment marche la méthode starts-with(.,'toto') ?
    le point correspond à quoi? (premier argument de starts-with

    Edit :

    Excuse moi si je me trompe : le résultat que j'aurais sera la liste des premières case de tableau non? parce que ce que je cherche c'est bien stocker la liste des lignes dont la première case commence par toto

    Edit Edit :

    oui ça a l'air d'être çà

    Merci pour l'aide !

  4. #4
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Par défaut
    le point c'est l'element en cours de lecture dans ton xpath et comme par defaut on utilise la valeur textuelle d'un noeud dans une comparison c'est celle-ci.
    Je sens que ça t'aide la

    Ici tu peux remplacer par text(), ce n'est pas la même chose mais ca donnera le même resultat et sera peut être plus clair

  5. #5
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Par défaut
    Citation Envoyé par loic_86

    Excuse moi si je me trompe : le résultat que j'aurais sera la liste des premières case de tableau non? parce que ce que je cherche c'est bien stocker la liste des lignes dont la première case commence par toto
    oui

    alors plutot

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //w:tbl/w:tr[w:tc[1][ starts-with(text(),'toto')]]

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2005
    Messages : 135
    Par défaut
    et ben fallait forcement s'y attendre mais ça me pose un problème pour la casse.

    en effet, il peut s'agir de toto TOTO ou ToTo...

    je sais qu'il y a une fonction translate mais je sais pas du tout comment l'incorporer dans mon XPath...

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2005
    Messages : 135
    Par défaut
    ou étant donné que je peux avoir 2 cas de figure possible, disons TOTO et toto,
    comment est ce que l'on peut faire un OU logique?

  8. #8
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Par défaut
    //w:tbl/w:tr[w:tc[1][ starts-with(translate(text(),'TO','to'),'toto')]]
    pour le ou c'est le mot or dans le predicat (la partie entre crochet)

    Ce sera tout pour le p'tit môssieur ?

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2005
    Messages : 135
    Par défaut
    eurf... ça marche pas

    ça ne me renvoi aucune réponse alors que dans le cas précédent, j'avais une partie du résultat...

  10. #10
    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
    On peut savoir quelle expression tu as utilisé réellement ? Il y avait bien 'toto' dedans ?
    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

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2005
    Messages : 135
    Par défaut
    Voila

    j'essaie d'extraire d'un word 2003 converti en xml (wordml) toute les lignes de tous les tableaux dont la première case commence par "RG-" qui correspondent à des identifiants

    Dans le fichiers doc, pas de problème car tous les identifiants sont en majuscules. mais lorsque l'on converti le fichier en xml, ça change un peu : certains commencent par "RG-" et d'autres par "rg-"...

    => je cherche donc à contourner les problèmes de casse ...

    c'est en C# et ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
    nsmgr.AddNamespace("w","http://schemas.microsoft.com/office/word/2003/wordml");
    nsmgr.AddNamespace("o", "urn:schemas-microsoft-com:office:office");
     
    XmlNodeList nodeListRG = 
                doc.SelectNodes("//w:tbl/w:tr[w:tc[1][starts-with(.,'RG-')]]", nsmgr);
    mais ça ne me renvoie pas les lignes dont la première case commence par "rg-"...

  12. #12
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Par défaut
    il n'y a pas le translate dans ton expression comment veux tu que ça te renvoie rg-

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2005
    Messages : 135
    Par défaut
    ouais ça donne ça avec le translate mais je n'ai aucune réponse...
    alors qu'avec celle que j'ai mise je n'ai que les lignes avec les "RG-" (ce qui est normal)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    XmlNodeList nodeListRG = doc.SelectNodes("//w:tbl/w:tr[w:tc[1][starts-with(translate(text(),'RG','rg'),'RG-')]]", nsmgr);

  14. #14
    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 loic_86
    ouais ça donne ça avec le translate mais je n'ai aucune réponse...
    alors qu'avec celle que j'ai mise je n'ai que les lignes avec les "RG-" (ce qui est normal)
    Normal, tu n'as pas bien lu le code que t'a donné Erwy : si tu prends la peine de convertir les majuscules en minuscules, ce n'est pas pour ensuite comparer le résultat à une chaîne en majuscules...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    XmlNodeList nodeListRG = doc.SelectNodes("//w:tbl/w:tr[w:tc[1][starts-with(translate(text(),'RG','rg'),'rg-')]]", nsmgr);
    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

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2005
    Messages : 135
    Par défaut
    oui tu as raison mais même en changeant le "RG-" par "rg-" j'ai toujours 0 réponses alors que si j'enleve le translate j'ai plusieurs réponses mais pas toutes à cause de la casse

    j'ai essayé de prendre la commande dans tous les sens pour voir mais sans résultat

  16. #16
    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
    Dans ce cas, c'est que le texte de la cellule doit être dans une balise... Essaie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    XmlNodeList nodeListRG = doc.SelectNodes("//w:tbl/w:tr[w:tc[1][starts-with(translate(.,'RG','rg'),'rg-')]]", nsmgr);
    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

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2005
    Messages : 135
    Par défaut
    Cool !

    ça à l'air de marcher !

    donc si j'ai bien compris,

    translate(.,'RG','rg') remplace tous les r et g en R et G pour le noeud en cours et tous les noeuds fils

    translate(text(),'RG','rg') remplace tous les r et g en R et G pour la chaine de caractère compris à l'intérieur du noeud en cours donc s'il n'y a pas de texte dans le noeud en cours mais qu'il y a des noeuds fils ça marche pas...


    Si c'est ça, je vous remercie pour le temps que vous avez mis à m'aider !


    merci !

  18. #18
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Par défaut
    Citation Envoyé par loic_86
    translate(text(),'RG','rg') remplace tous les r et g en R et G pour la chaine de caractère compris à l'intérieur du noeud en cours donc s'il n'y a pas de texte dans le noeud en cours mais qu'il y a des noeuds fils ça marche pas...
    En effet, c'est pour ça que mon premier XPath utilisait . et pas text() mais comme c'etait plus complexe à expliquer et que j'avais compris, a tort, que le dernieur noeud n'en contenait pas d'autre...

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2005
    Messages : 135
    Par défaut
    Bonjour à tous,

    Plutôt que de créer un nouveau sujet je préfère continuer celui là

    là je suis bloqué car je cherche à faire une recherche de string dans toutes les cases d'une ligne d'un tableau... puis stocker l'indice de la case...

    Est ce que c'est possible en XPath ou pas?

    parce que là je vois pas du tout comment faire...

    Je pense qu''il devrait y avoir cette séquence ou quelque chose dans le genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    //w:tbl/w:tr[1][w:tc[indice][starts-with('identifiant')]]
    indice étant un entier qui s'incrémente à chaque boucle car oui je sais il faudrait aussi faire une boucle de type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for(int i=0; i<count(cases dans la ligne); i++)
    {
     
    }
    merki de votre aide

  20. #20
    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
    XPath n'est pas un langage procédural, c'est un langage de sélection de noeuds dans un arbre XML. Donc il faut que tu codes ta boucle en C#, et relances la sélection XPath à chaque itération en changeant l'indice.
    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. Fonction DELETE avec critères spécifiques
    Par nubed dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 04/04/2014, 10h24
  2. [XL-2010] Utilisation de somme.si.ens avec critère spécifique
    Par clem256 dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 06/01/2014, 15h53
  3. Calcul du temps écoulé avec critères spécifiques
    Par kedmard dans le forum VBA Access
    Réponses: 8
    Dernier message: 08/06/2012, 14h49
  4. Recherche de données avec un critère spécifique
    Par TERRIBLE dans le forum Deski
    Réponses: 1
    Dernier message: 06/08/2010, 13h48
  5. Réponses: 2
    Dernier message: 22/09/2007, 11h39

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