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 :

[XSLT] Compteur dans un "preceding-sibling::"


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut [XSLT] Compteur dans un "preceding-sibling::"
    Bonjour,

    J'ai un fichier XML semblable à un flux RSS tel que celui-ci :

    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
     
    <item>
     <source>Google News</source>
     <title>Actualité Google 1</title>
    </item>
    <item>
     <source>Google News</source>
     <title>Actualité Google 2</title>
    </item>
    <item>
     <source>Google News</source>
     <title>Actualité Google 3</title>
    </item>
    <item>
     <source>Yahoo</source>
     <title>Actualité Yahoo 1</title>
    </item>
    <item>
     <source>Yahoo</source>
     <title>Actualité Yahoo 2</title>
    </item>
    <item>
     <source>Yahoo</source>
     <title>Actualité Yahoo 3</title>
    </item>
    Grâce à une XSLT, je désire obtenir le résultat suivant:

    1. Google News
    ------------
    Actualité Google 1
    Actualité Google 2
    Actualité Google 3

    2. Yahoo
    ------------
    Actualité Yahoo 1
    Actualité Yahoo 2
    Actualité Yahoo 3

    J'ai fait un regroupement grâce à la fonction preceding-sibling de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <xsl:apply-templates select="item"/>
     
    <xsl:template match="item">
     <xsl:if test="not ( (preceding-sibling::*/source) = source )">
      <div><xsl:value-of select="source"/></div>
     </xsl:if>
     
     <div><xsl:value-of select="title" /></div>
    </xsl:template>
    Problème, je n'arriver pas à numéroter le titre des sources.
    Si j'utilise position(), Yahoo se retrouve en 5 au lieu de 2

    J'ai regardé la FAQ ainsi qu'un topic en utilisant "count(preceding-sibling::" mais je patauge...

    Pouvez-vous m'aider ?

  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, et bienvenue sur les forums de Developpez.com

    Disons qu'une lecture attentive de la FAQ t'aurait donné la solution... La voici :
    1) indexe les éléments <source> par leur contenu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:key name="sources" match="source" use="."/>
    2) Fais un regroupement des sources par la méthode Muench ; la numérotation se fera tout simplement grâce à position() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:for-each select="//source[generate-id(.) = generate-id(key('sources', .)[1])]">
      <xsl:value-of select="position()"/>
      <xsl:value-of select="."/>
      ...
    </xsl:for-each>
    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
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci !!

    J'avais lu la FAQ et la méthode de Muench mais je pensais qu'il existait une solution sans utiliser cette méthode (mon XML étant déjà trié), avec un apply-templates basique.
    Mais bon, comme je débute et que je ne savais pas par quel bout commencer je dois avouer que Muench m'a fait un peu peur...

    Dans la solution que tu me donnes, seules les sources sont affichées. Pour afficher les "title" de chaque source, je suppose qu'il faut utiliser un autre for-each, n'est-ce pas ?

    Je fais donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <xsl:for-each select="//source[generate-id(.) = generate-id(key('sources', .)[1])]">
      <xsl:value-of select="position()"/>
      <xsl:value-of select="."/>
      <xsl:for-each select="//title">
        <xsl:value-of select="."/>
      </xsl:for-each>
    </xsl:for-each>
    Mais là, tous les title sont affichés.
    Comment je peux faire pour afficher seulement les titres de la catégorie en cours ?

    Désolé, en plus ça doit vraiment pas être compliqué la solution

  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 loloajax
    Comment je peux faire pour afficher seulement les titres de la catégorie en cours ?
    Tout simplement en convertissant cette phrase en bon français en un prédicat XPath :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:for-each select="//title[../source=current()]">
        <xsl:value-of select="."/>
    </xsl:for-each>
    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
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci ça marche impec !

    Et bonne continuation à ce forum, vraiment utile.

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

Discussions similaires

  1. [XSLT]Guillemets dans quote
    Par valal dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 07/12/2007, 16h24
  2. [XSLT] preceding-sibling dans un sous ensemble
    Par ddams dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 20/02/2007, 17h36
  3. [XSLT] Preceding sibling
    Par tommey dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 18/08/2006, 19h02
  4. Modification d'un texte dans une fenetre "d'erreur"
    Par PAUL87 dans le forum Access
    Réponses: 8
    Dernier message: 21/10/2005, 13h12

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