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] sélection de noeuds entre 2 noeuds


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 33
    Points : 20
    Points
    20
    Par défaut [XPath] sélection de noeuds entre 2 noeuds
    Bonjour, mon problème est relativement simple : je voudrais récupérer tous les nœuds qui se trouvent entre un nœud A et un noeud B, ces deux nœuds étant au même niveau dans la structure que les nœuds à récupérer.

    Un exemple rendras les choses plus claires :

    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
    27
    <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
    	<fo:inline font-family="Arial, sans-serif" font-size="10pt">
    		##BODY##
    	</fo:inline> 
    	<fo:inline font-family="Arial, sans-serif" font-size="10pt">
    		<fo:leader lang="7">blde la patate</fo:leader>
    		<fo:inline font-weight="bold">Nom : </fo:inline>
    		<fo:inline lang="2">B</fo:inline>
    		<fo:leader>29.99</fo:leader>
    		<fo:inline lang="3" font-weight="bold">C</fo:inline>
    	</fo:inline>
     
    	<fo:inline font-family="Arial, sans-serif" font-size="10pt">
    		<fo:inline lang="4">Learning XML</fo:inline>
    		<fo:inline lang="4">Learning XML</fo:inline>
    	</fo:inline> 
     
    	<fo:inline font-family="Arial, sans-serif" font-size="10pt">
    		##/BODY##
    	</fo:inline> 
     
    	<fo:inline font-family="Arial, sans-serif" font-size="10pt">
    		<fo:inline lang="4">Learning XML</fo:inline>
    		<fo:leader>39.95</fo:leader>
    		<fo:inline lang="4">blabla</fo:inline>
    	</fo:inline> 
    </fo:block>
    Dans cet éxemple j'aimerais récupérer QUE le contenu des nœuds inline qui se trouvent entre ##BODY## et ##/BODY##, et ne pas récuperer donc les deux derniers nœuds inline dans cet exemple (Learning XML et blabla)

    J'ai trouvé quelque chose sur le mailing de Stylus studio qui semble corréspondre à mon souci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    following-sibling::*[generate-id(following-sibling::tag[1]) = generate-id(current()/following-sibling::tag[1])]
    Si quelqu'un pouvais proposer une piste ça serais pas de refus ^^

    PS : je ne travaille pas en xslt, j'ai simplement besoin de créer un chemin xPath exploitable ensuite parallèlement à du DOM pour parcourir mon xml

  2. #2
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    ce n'est pas un problème simple, d'autant plus que generate-id(), généralement utilisé pour traiter ce genre de cas, n'est disponible que dans un contexte XSLT...

    Voici comment je traiterais la chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //fo:block/fo:inline[preceding-sibling::fo:inline[normalize-space() = '##BODY##'] and following-sibling::fo:inline[normalize-space() = '##/BODY##']]
    Attention, c'est basé sur le postulat qu'il n'y a qu'une seule occurrence de ##BODY## et ##/BODY## par fo:block.
    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

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 33
    Points : 20
    Points
    20
    Par défaut
    effectivement non seulement il n'y auras qu'une seule occurrence de body par block, mais il y auras un seul couple ##BODY## ##/BODY## dans le document.

    Je vais voir la solution que tu me propose comment ca va se passer

    merci en tout cas pour ton aide rapide

    EDIT :je viens de regarder le xPath et si je remplace le AND entre les deux conditions par un OR je résoudrais le problème je pense, car le OR me renvoi qu'un nœud qui a comme previous-sibling BODY et comme next-sibling BODY, mais je peut avoir bien plus de noeuds entre ces deux balises

    Je vais tester et je te tiens au courant

  4. #4
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Citation Envoyé par bluehige Voir le message
    EDIT :je viens de regarder le xPath et si je remplace le AND entre les deux conditions par un OR je résoudrais le problème je pense, car le OR me renvoi qu'un nœud qui a comme previous-sibling BODY et comme next-sibling BODY, mais je peut avoir bien plus de noeuds entre ces deux balises


    L'expression que j'ai donnée renvoie tous les noeuds compris entre les balises « BODY » ; si tu remplaces le AND par un OR, tu auras toutes les balises inline du block.
    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

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 33
    Points : 20
    Points
    20
    Par défaut
    EDIT : bon mea culpa, j'avais bêtement copié ton expression sans la modifier là ou nécessaire, elle marche nikel

    je te remercie beaucoup, ça va m'éviter un traitement de chaine qui aurais été bien plus lourd

    Une dernière petite question en passant :

    si ma balise d'ouverture BODY est sous forme ##BODY param1=blabla param2 = lol##

    je peu quand même utiliser ton expression en remplacant le normalize-space par contains() ?

  6. #6
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Citation Envoyé par bluehige Voir le message
    je peu quand même utiliser ton expression en remplacant le normalize-space par contains() ?
    Oui, sans problème, à partir du moment où il n'y a pas de risque d'ambiguïté
    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

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 33
    Points : 20
    Points
    20
    Par défaut
    et comment est ce que tu récupère la valeur du noeud? avec self je n'arrive pas à la récuperer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    contains(self, "##BODY")
    EDIT : c'est bon j'ai trouvé mon bonheur en utilisant

    ce qui au final me donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //fo:block[preceding-sibling::fo:block[contains(.,'##BODY')] and following-sibling::fo:block[contains(., '##/BODY')]]/fo:inline
    problème résolu, je te remercie

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

Discussions similaires

  1. [XSLT] Récupération de noeuds entre 2 noeuds
    Par Invité dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 08/06/2009, 03h08
  2. [XPATH] sélection multiple de noeuds en même temps
    Par ely85 dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 03/02/2008, 21h01
  3. [XPath] Sélection d'un noeud fils du noeud courant
    Par hobotalker dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 27/06/2007, 15h55
  4. [Xpath] Sélection des noeuds dont un attribut
    Par toxine dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 29/01/2007, 14h22
  5. [XPath] Recuperation des noeuds Entre Deux Commentaires
    Par yos dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 03/07/2006, 13h08

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