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 :

sur une expression XPath [XPATH 1.0]


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2010
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2010
    Messages : 212
    Par défaut sur une expression XPath
    salut:
    soit le doc XML:
    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
     
    <livre titre="Mon livre">
    <auteurs>
    <auteur nom="nom1" prenom="prenom1"/>
    <auteur nom="nom2" prenom="prenom2"/>
    </auteurs>
    <sections>
    <section titre="Section1">
    <chapitre titre="Chapitre1">
    <paragraphe>Premier paragraphe</paragraphe>
    <paragraphe>Deuxième paragraphe</paragraphe>
    </chapitre>
    </section>
    <section titre="Section2">
    <chapitre titre="Chapitre1">
    <paragraphe>Premier paragraphe</paragraphe>
    <paragraphe>Deuxième paragraphe</paragraphe>
    </chapitre>
    </section>
    </sections>
    </livre>
    je cherche à trouver la liste des chapitres dont un paragraphe possède le mot "Deuxième";
    voici ma solution au format non abrégé, qui renvoie toujours l'ensemble vide:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /child::livre/child::sections/child::section/child::chapitre[contains(child::paragraphe/text(),"Deuxième")]
    pourtant avec le mot "Premier" çà marche trés bien
    MERCI

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 18
    Par défaut
    Si ça marche avec "Premier" mais pas avec "Deuxième", peut-être que c'est un problème d'encodage de caractères... J'avoue que je ne maîtrise pas bien ce sujet : que se passe-t-il sur les comparaisons de chaîne quand l'encodage du fichier XML n'est pas celui du fichier XSL ? Quand il n'y a pas d'encodage déclaré pour un ou les deux fichiers ?

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Ce n'est pas un problème d'encodage.
    Pour information, quand on arrive au niveau du traitement, l'encodage n'existe plus depuis longtemps, on ne compare plus que des lettres et des caractères, jamais des octets. Pour information aussi, quand un encodage n'est pas spécifié, alors un encodage par défaut est choisi, et les traitements ultérieurs ne sont pas concernés.

    Pour information encore, le xpath super long qu'on nous a montré se simplifie ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //chapitre[contains(paragraphe, "Deuxième")]
    seulement, contains(paragraphe, "Deuxième") signifie "prendre le premier fils <paragraphe>, calculer sa valeur texte et vérifier si elle contient 'Deuxième'."

    On ne veut pas se limiter au premier fils paragraphe, mais à tous les fils paragraphes. Voici comment :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //chapitre[paragraphe[contains(., "Deuxième")]]
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  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 : 48
    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 thelvin Voir le message
    Pour information encore, le xpath super long qu'on nous a montré se simplifie ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //chapitre[contains(paragraphe, "Deuxième")]
    C'est faux ceci n'est pas le Xpath simplifié .
    C'est le raccourci d'écriture pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /descendant-or-self::*/chapitre[contains(paragraphe, "Deuxième")]
    Et utiliser cet axe comme "raccourci" d'ecriture vient en tête des mauvaises pratqiues XPath, puisqu'il va parser tous les noeuds descendant induisant un surcout important en mémoire et en temps de calcul .

    Si on la chance dans cet exemple que paragraphe soit une feuille et qu'il n'y ait pas de surcout (à condition aussi que cet XML soit bien le cas final), il n'en reste pas moins que c'est une très mauvaise chose que d'entretenir cette confusion déjà trop répandu.

    le xpath simplifié est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /livre/sections/section/chapitre[contains(paragraphe,"Deuxième")]

  5. #5
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2010
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2010
    Messages : 212
    Par défaut
    merci infiniment, çà marche trés bien;
    Mais le "." reprsente quoi?

    l'expression suivante renvoie le vide pour quoi?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //chapitre[contains(paragraphe/., "Deuxième")]

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Juste pour info, la remarque d'Erwy est réelle.
    - D'abord ma simplification n'est pas identique à ton xPath de départ (elle peut potentiellement faire plus de choses, mais elle fait probablement ce que tu veux et est bien plus courte. Erwy a indiqué comment faire exactement la même chose en plus simple.)
    - ensuite elle est beaucoup moins efficace. Bien sûr, ça n'a de sens que sur des gros fichiers, mais ma supposition que ton fichier n'a qu'un petit nombre d'éléments, de l'ordre des milliers, peut être fausse.

    Citation Envoyé par win_ubuntu Voir le message
    Mais le "." reprsente quoi?
    "élément en cours."
    Comme dans les systèmes de fichiers, le . représente le répertoire en cours, et le .. représente le répertoire parent.
    Ici, c'est pareil.

    Citation Envoyé par win_ubuntu Voir le message
    l'expression suivante renvoie le vide pour quoi?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //chapitre[contains(paragraphe/., "Deuxième")]
    Parce qu'elle est identique à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //chapitre[contains(paragraphe, "Deuxième")]
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre Expert
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Par défaut
    Petite remarque :

    Si tu veux que seuls les éléments "paragraphe" soient comptabilisés, tu peux écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /livre/sections/section/chapitre[contains(.[node() = paragraphe],'Deuxième')]
    Ainsi, si tu l'appliques là dessus, seul les 2 premiers chapîtres seront retournés :
    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
    25
    26
    <livre titre="Mon livre">
    	<auteurs>
    		<auteur nom="nom1" prenom="prenom1"/>
    		<auteur nom="nom2" prenom="prenom2"/>
    	</auteurs>
    	<sections>
    		<section titre="Section1">
    			<chapitre titre="Chapitre1">
    				<paragraphe>Premier paragraphe</paragraphe>
    				<paragraphe>Deuxième paragraphe</paragraphe>
    			</chapitre>
    		</section>
    		<section titre="Section2">
    			<chapitre titre="Chapitre1">
    				<paragraphe>Premier paragraphe</paragraphe>
    				<paragraphe>Deuxième paragraphe</paragraphe>
    			</chapitre>
    		</section>
    		<section titre="Section3">
    			<chapitre titre="Chapitre1">
    				<para>Premier paragraphe</para>
    				<para>Deuxième paragraphe</para>
    			</chapitre>
    		</section>
    	</sections>
    </livre>
    EDIT :
    Par contre, bizarrement, ceci ne fonctionne pas (que ce soit avec "name" ou "local-name" d'ailleurs) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /livre/sections/section/chapitre[contains(.[name() = 'paragraphe'],'Deuxième')]

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

Discussions similaires

  1. [SimpleXML] besoin d'aide sur une expression xpath
    Par ANISSS dans le forum Bibliothèques et frameworks
    Réponses: 8
    Dernier message: 11/05/2007, 10h23
  2. [RegEx] Aide sur une expression regulière
    Par zulkifli dans le forum Langage
    Réponses: 1
    Dernier message: 13/03/2007, 15h02
  3. [XPATH] Evaluer une expression xpath dans un xml
    Par antigone dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 29/01/2007, 17h21
  4. [RegEx] Aide sur une expression régulière toute simple
    Par tchoumak dans le forum Langage
    Réponses: 3
    Dernier message: 29/11/2005, 15h46
  5. Problème sur une expression régulière
    Par Verbal-Quint dans le forum Langage
    Réponses: 6
    Dernier message: 12/11/2004, 10h54

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