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 et DISTINCT


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 14
    Par défaut XPath et DISTINCT
    Bonjour à tous !

    J'ai un petit soucis pour faire un "distinct" sur une instruction XPath, voilà l'exemple du fichier XML :
    <Consults>
    <Id>TEST1</Id>
    <Id>TEST3</Id>
    <Id>TEST2</Id>
    <Id>TEST1</Id>
    <Id>TEST4</Id>
    <Id>TEST3</Id>
    </Consults>

    Je cherche comment avoir la liste des différents Id avec une expression XPath du genre : /Consults[not(Id = preceding-sibling::Id]/Id mais je bloquesur l'expression exacte...

    Si quelqu'un a une petite solution à proposer

    Merci d'avance

  2. #2
    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
    Bonjour,

    pour que ca marche avec une simple requête XPath, il faudrait que tes éléments soient triés. A la place, je te propose une méthode plus robuste pour regrouper des éléments, appelée "Méthode Muench" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
    <xsl:key name="id" match="Id" use="."/> 
     
    <xsl:template match="/">
      <resultat>
        <xsl:for-each select="//Id[generate-id(.)=generate-id(key('id', .)[1])]">
          <xsl:sort select="."/>
          <xsl:copy-of select="."/>
        </xsl:for-each>
      </resultat>
    </xsl:template>
     
    </xsl:stylesheet>
    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 averti
    Inscrit en
    Mars 2004
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 14
    Par défaut
    Merci pour cette réponse même si ce n'est pas celle à laquelle je m'attendais

    N'est-il pas du tout possible de le faire juste en XPath au lieu d'intégrer ça dans un XSL ?

    Merci

  4. #4
    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
    Ah non, désolé : à moins qu'un "XPath guru" ne me contredise, il n'est pas possible d'obtenir ce que tu veux avec une seule requête XPath, en tout cas dans sa version 1.0.

    Peut-être qu'avec XQuery...
    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
    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
    comprends pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /Consults[not(Id = preceding::Id)]/Id
    marche,en tout cas j'en ai vu de ce type et il n'y a pas besoin que ce soit trier par contre TRES couteux sur un gros document
    Tiens une autre methode mais qui doit etre - performante que celle de grandfather
    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
     
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
     
     
    <xsl:template match="/"> 
      <xsl:element name="resultat"> 
      <xsl:call-template name="suivant">
          <xsl:with-param name="liste" select="//Id"/>
        </xsl:call-template >  
     
      </xsl:element> 
    </xsl:template >
     
    <xsl:template name="suivant"> 
      <xsl:param name="liste" />
      <xsl:variable name="premier" select="$liste[1]"/>
      <xsl:copy-of select="$premier"/>
      <xsl:if test="$liste[Id!=$premier]">
        <xsl:call-template name="suivant">
          <xsl:with-param name="liste" select="$liste[Id!=$premier]"/>
        </xsl:call-template >  
      </xsl:if>    
    </xsl:template>
     
    </xsl:stylesheet>

  6. #6
    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
    Effectivement, j'avais pas vraiment réfléchi, mais y'a une solution XPath simple qui marche, même si catastrophique au niveau performances

    A ce propos, Erwy, la tienne ne fonctionne pas... L'instruction correcte serait plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //Id[not(preceding-sibling::Id = .)]
    ...juste histoire d'avoir le dernier mot
    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 averti
    Inscrit en
    Mars 2004
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 14
    Par défaut
    Ah ben voilà merci GrandFather c'est exactement ça que je cherchait !

    TROP BIEN

    Merci !

  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 : 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 GrandFather

    A ce propos, Erwy, la tienne ne fonctionne pas... L'instruction correcte serait plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //Id[not(preceding-sibling::Id = .)]
    ...juste histoire d'avoir le dernier mot
    exact
    dans mon cas j'avais pris exemple sur un distinct d'attribut d'ou l'erreur lors de la retranscription

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

Discussions similaires

  1. [XPATH] distinct values
    Par yannick29000 dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 19/08/2010, 15h11
  2. sum(XPATH) retourne NaN
    Par TOM-Z dans le forum XMLRAD
    Réponses: 4
    Dernier message: 19/03/2003, 13h48
  3. XPath: intersection de chemins
    Par aldo047 dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 13/03/2003, 10h30
  4. Cours en Français sur XML-XSL et XPath
    Par Community Management dans le forum XSL/XSLT/XPATH
    Réponses: 0
    Dernier message: 25/04/2002, 15h46

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