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] Récupérer les enfants d'une personne sans les petits fils


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Invité
    Invité(e)
    Par défaut [XPATH] Récupérer les enfants d'une personne sans les petits fils
    Bonjour,

    Je me casse la tête à savoir comment récupérer la liste des enfants d'une personne sans récupérer les petit-enfants.

    En gros :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?xml version="1.0" encoding="utf-8"?>
    <personne name="parent">
      <persone name="enfant1">
        <persone name="petit-enfant11" />
        <persone name="petit-enfant12" />
        <persone name="petit-enfant13" />
      </persone>
      <persone name="enfant2">
        <persone name="petit-enfant21" />
        <persone name="petit-enfant22" />
        <persone name="petit-enfant23" />
      </persone>
    </personne>
    En gros je veux récupérer les enfants de l'élément personne avec name="parent" sans inclure les petits enfants. Donc je dois m'arrêter aux éléments personne de niveau 1 mais en XPATH pas de notion de niveau. j'ai essayé la fonction position() mais ça ne sert à rien.

    Quelqu'un aurait il une idée ?

    Merci d'avance.

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    Oui. Récupère les nœuds avec tous leurs descendants, mais ne fais rien du tout avec les descendants. Ne t'intéresse qu'aux nœuds qui t'intéressent.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Je m'explique. J'ai une méthode C# qui me permet d'appliquer du XPATH sur un document XML. La méthode me renvoie une liste de noeuds (y compris les descendants). Lorsque j'ai le résultat impossible de les différencier.
    Si j'arrive à différencier les enfants des petits enfants à travers la requête XPATH que je passe à ma méthode C# cela serait bien.
    Merci pour ta réponse quand même.

    T'aurais d'autre propositions ?

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    Oui :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //personne[@name='parent']/personne
    Dans ton exemple, ce xPath obtiendra enfant1 et enfant2, et rien d'autre.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Oui :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //personne[@name='parent']/personne
    Dans ton exemple, ce xPath obtiendra enfant1 et enfant2, et rien d'autre.
    Seulement si la valeur de l'atribut name est unique ce qui n'est pas le cas dans mon problème.

    Merci pour la réponse.

    Y a t il d'autre solution.

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    Combien de temps va-t-il falloir jouer ? Indique simplement ce que tu veux, et on te dira si ça nous paraît possible et si oui, comment...

    Tu peux essayer :

    Ça renvoie ce que tu demandes, mais ça exige que la racine soit le grand-père.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //personne/personne[count(ancestor::personne) = 1]
    Ça renvoie ce que tu demandes, mais ça interdit la présence d'autres éléments <personne> où que ce soit dans les ancêtres.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //personne[not(parent::personne)]/personne
    Ça renvoie ce que tu demandes, tout élément personne ayant un parent personne, et pas de grand-parent personne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //*[name() != 'personne']/personne/personne
    Ça renvoie ce que tu demandes, tout élément personne ayant un parent personne, et un grand-parent, qui n'est pas une personne.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Mon problème est que tous mes éléments ont pour nom "Personne" et chaque élément n'a pas d'attribut ayant une valeur unique permettant de le différencier des autres sinon le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    //personne[@name='parent']/personne
    marcherais à 100%.

  8. #8
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    C'est bon à savoir.

    Mais je ne te demande pas ton problème (du moins, pas seulement.) Je te demande ce que tu veux sélectionner.

    Je t'ai donné plein d'exemples qui font ce que tu as demandé. Si ça ne convient pas, c'est qu'il y a des choses à préciser, et personne ne peut deviner quoi.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bon voici mon un exemple du contenu que j'ai :
    Code xml : 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
    28
    29
    30
    31
    32
     
    <Section name="Asset" assetName="Media">
      <Section name="Conditions" />
     
      <Section name="Asset" assetName="Video">
     
        <Section name="Conditions">
          <Option name="IsFileRequired" value="false" />
          <Option name="IsMetadataFileRequired" value="false" /> 
        </Section>
     
        <Section name="Asset" assetName="Image">
          <Option name="AssetType"/>
          <Section name="Conditions">
            <Option name="IsFileRequired" value="false" />
          </Section>
        </Section>
     
      </Section>
    </Section>
    <Section name="Asset" assetName="Media">
      <Section name="Conditions" />
      <Section name="Asset" assetName="Video">
     
        <Section name="Conditions">
          <Option name="IsFileRequired" value="false" />
          <Option name="IsMetadataFileRequired" value="false" />
          <Option name="VerifyFormat" value="false" />      
        </Section>
     
      </Section>
    </Section>

    Chaque élément section ayant name="Asset" peut contenir autant de section ayant un name="Asset". Moi je veux récupérer toutes les sections directes d'une section name="Asset" sans récupérer les sections du deuxième niveau sans me baser sur la valeur de l'attribut assetName qui n'est lui aussi pas unique par niveau.

  10. #10
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    C'est pourtant pas compliqué d'ajouter des

    <!-- ça, je le veux -->
    et
    <!-- ça, je le veux pas -->

    -_-°.

    Bon.

    En admettant que j'ai bien compris, tu as besoin de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /Section[@name = 'Asset']/Section
    L'élément racine est un Section, avec name=Asset. On ne le veut pas lui, on veut les éléments Section qui sont ses enfants. Et on ne veut pas ses petits enfants.

  11. #11
    Invité
    Invité(e)
    Par défaut
    Ok, tu viens de comprendre.

    Mais avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /Section[@name = 'Asset']/Section
    j'aurais dans le résultat la section <Section name="Asset" assetName="Image"> alors que c'est l'élément enfant de <Section name="Asset" assetName="Video"> qui est lui même enfant de <Section name="Asset" assetName="Media">.

  12. #12
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    Non, tu ne les auras pas, puisque cette expression ne peut récupérer que les enfants de la racine.
    Vérifie.

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

Discussions similaires

  1. [XL-2007] Extraire les données d'une plage sans les doublons
    Par timtiboum dans le forum Excel
    Réponses: 2
    Dernier message: 23/11/2010, 23h19
  2. [XL-2003] Appliquer une formule à toutes les lignes d'une colonne sans en connaitre le nombre à l'avance
    Par Chevrefeuille dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 08/04/2010, 14h43
  3. récupérer des informations d'une feuille et les placer dans une autre
    Par winclass dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 16/12/2008, 21h34
  4. Réponses: 4
    Dernier message: 22/05/2007, 14h42
  5. [Image] Connaitre les dimensions d'une image sans la charger
    Par FredN dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 16/01/2006, 12h06

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