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] Enfants en doublons


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 20
    Points : 13
    Points
    13
    Par défaut [XPath] Enfants en doublons
    Bonjour à tous,

    J'ai une problématique "toute simple" que je souhaiterais écrire directement en une seule requête XPath (j'imagine que ca doit etre possible ). Sur mon input xml, j'ai besoin de détecter les balises qui ont au moins 2 enfants identiques (la clé de recherche étant la valeur d'un attribut spécifique). Sur l'exemple ci-dessous, j'aimerais pouvoir identifier la balise A d'id 1 et ses enfants B[@name='prop']:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <A id="1">
    <B name="prop"><![CDATA[1]]></B>
    <B name="prop"><![CDATA[2]]></B>
    <B name="disp"><![CDATA[3]]></B>
    </A>
    <A id="2">
    <B name="prop"><![CDATA[4]]></B>
    <B name="disp"><![CDATA[5]]></B>
    </A>
    J'ai écrit une petite routine qui répond à mon besoin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <xsl:for-each select="//A">
    <xsl:for-each select="B">
    <xsl:variable name="N" select="@name"/>
      <xsl:if test="count(../B[@name=$N])>1">
        (...)
      </xsl:if>
    </xsl:for-each>
    </xsl:for-each>
    ... Mais j'avoue ne pas en être complètement satisfait ! J'ai un peu de mal à voir comment en XPath, je peux compter le nombre d'attributs enfants de même nom. Qqchose dans le style ?
    Merci d'avance pour vos réponses !

    ++ Pop

  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,

    il suffit de se baser sur les fonctions d'ensembles de XPath.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //B[@name = preceding-sibling::B/@name|following-sibling::B/@name]/parent::A
    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
    Août 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    Effectivement c'est tout simple, merci !
    Je n'avais pas encore utilisé ces fonctions bien utiles

    ++
    Pop

    PS: Sympa votre tutoriel XPath...

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    Dernière question !! Si je souhaite de cette input, ne sortir que la balise A avec ses enfants B en doublons :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <A id="1">
    <B name="prop"><![CDATA[1]]></B>
    <B name="prop"><![CDATA[2]]></B>
    <B name="disp"><![CDATA[3]]></B>
    </A>
    <A id="2">
    <B name="prop"><![CDATA[4]]></B>
    <B name="disp"><![CDATA[5]]></B>
    </A>
    J'ai envie d'écrire cette requete XPath :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //A[@name=following-sibling::B/@name|preceding-sibling::B/@name]/ancestor-or-self::*
    Pour obtenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <A id="1">
    <B name="prop"><![CDATA[1]]></B>
    <B name="prop"><![CDATA[2]]></B>
    </A>
    Voire plus simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //A[@name=following-sibling::B/@name]/ancestor-or-self::*
    Pour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <A id="1">
    <B name="prop"><![CDATA[1]]></B>
    </A>
    Dans les deux cas, ce ne me remonte pas ce que je veux... J'ai pas du suivre correctement la tutoriel.

    Merci d'avance pour vos réponses,
    Pop

Discussions similaires

  1. [XsL/xpath]Comment faire pour éviter les doublons?
    Par BigBarbare dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 22/05/2007, 20h31
  2. [XPath] test d'existence de noeud avec conditions sur les enfants
    Par MasterOfChakhaL dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 11/04/2007, 10h42
  3. [XPath] Problème avec des doublons
    Par pikifou dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 03/09/2006, 23h30
  4. [XPath/VB.Net] Comment pointer sur un noeud enfant ?
    Par Petit_ange dans le forum Accès aux données
    Réponses: 5
    Dernier message: 27/08/2006, 13h15
  5. [xpath]selectionner le contenu NON enfants entre 2 balises
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 15/11/2005, 11h26

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