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] Regroupement sur base d'un attribut enfant


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre à l'essai
    Homme Profil pro
    infographiste
    Inscrit en
    Avril 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : infographiste
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2012
    Messages : 41
    Points : 23
    Points
    23
    Par défaut [XSLT] Regroupement sur base d'un attribut enfant
    Bonjour à tous,

    Je débute en XSLT et je cherche à regrouper des éléments grace à des attributs des enfants, ne maitrisent pas encore suffisamment le langage, je m'y perds,

    voici mon xml de départ

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    <?xml version="1.0" encoding="UTF-8"?>
    <blocs>
         <bloc>
              <prenon>Philippe</prenon>
              <date>2014-12-01</date>
              <category text="E1"/>
         </bloc>
         <bloc>
              <prenon>Pol</prenon>
              <date>2013-10-15</date>
              <category text="D1">
                   <category text="D3B"/>
              </category>
         </bloc>
         <bloc>
              <prenon>Jacque</prenon>
              <date>2013-08-08</date>
              <category text="D1">
                   <category text="D2B"/>
              </category>
         </bloc>
         <bloc>
              <prenon>Jean</prenon>
              <date>2015-10-26</date>
              <category text="D1">
                   <category text="D2A"/>
              </category>
         </bloc>
         <bloc>
              <prenon>Claude</prenon>
              <date>2017-10-03</date>
              <category text="D1">
                   <category text="D2C"/>
              </category>
         </bloc>
         <bloc>
              <prenon>Ema</prenon>
              <date>2013-06-05</date>
              <category text="D1">
                   <category text="D2A"/>
              </category>
         </bloc>
    </blocs>
    et voici le résulta que je recherche :

    Code : 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"?>
    <root>
          <d1>Niveau1d</d1>
              <d2a>Niveau2da</d2a>
                   <prenon>Jean</prenon>
                   <prenon>Ema</prenon>
              <d2b>Niveau2db</d2b>
                   <prenon>Pierre</prenon>
                   <prenon>Jacque</prenon>
              <d2c>Niveau2dc</d2c>
                   <prenon>Claude</prenon>
          <e1>Niveau1e</e1>
              <prenon>Philippe</prenon>
    </root>
    Voici une des versions que j'ai peu faire :
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE xsl:stylesheet [
    <!ENTITY folder "file://links/">
    ]>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
         version="1.0">
     
         <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
     
         <xsl:variable name="livresAuCatalogue" select="/blocs/bloc"/>
     
         <xsl:template match="bloc">
              <xsl:variable name="blocCourante" select="."/>
              <xsl:for-each select="$livresAuCatalogue">
            <!--       <xsl:sort select="$blocCourante/date" order="descending"/>-->
                  <xsl:choose>
                       <xsl:when test="$blocCourante/category/@text = 'D1' ">
                       - <xsl:value-of select="$blocCourante/prenon"/><xsl:text></xsl:text><xsl:value-of select="$blocCourante/category/@text"/>
                       </xsl:when>
                       <xsl:when test="$blocCourante/category/@text = 'E1' ">
                            - <xsl:value-of select="$blocCourante/prenon"/><xsl:text></xsl:text><xsl:value-of select="$blocCourante/category/@text"/>
                       </xsl:when>
                  </xsl:choose>
               </xsl:for-each>
         </xsl:template>
    </xsl:stylesheet>
    Je pence que mon problème est d'être perdu dans l'arbre.

    Merci à vous

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Hello,

    En fait regrouper les éléments est compliqué à faire par nature en XSLT 1.0. (XSLT 2.0 fournit directement une balise pour ça, ce qui simplifie énormément.)

    Je te suggère de regarder la FAQ concernant Comment regrouper les noeuds en fonction de leurs éléments qui se ressemblent ?

    Si tu as encore des questions ensuite, n'hésite pas.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre à l'essai
    Homme Profil pro
    infographiste
    Inscrit en
    Avril 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : infographiste
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2012
    Messages : 41
    Points : 23
    Points
    23
    Par défaut
    Bonjour et merci thevin,

    Oui, j'avais trouvé l'exemple et je suis repartie sur cette base de test, et là, je cherche à regroupé sur deux et puis trois niveaux et je cherche à faire à applique des templates différents

    et de cette exemple trouvé, je le modifie à mon exemple ... la suite arrive

    Merci

  4. #4
    Membre à l'essai
    Homme Profil pro
    infographiste
    Inscrit en
    Avril 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : infographiste
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2012
    Messages : 41
    Points : 23
    Points
    23
    Par défaut première code
    Voilà, un premier test:
    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
    28
    29
    30
    <?xml version="1.0" encoding="iso-8859-1"?>
    <Root>
         <Rows>
              <Row>
                   <Column name="Title" Value="Document 10"/>
                   <Column name="Category" Value="E1">
                        <Column name="Category" Value="E2b"/>
                   </Column>
              </Row>
              <Row>
                   <Column name="Title" Value="Document 2"/>
                   <Column name="Category" Value="C1">
                        <Column name="Category" Value="C2b"/>
                   </Column>
              </Row>
              <Row>
                   <Column name="Title" Value="Document 3"/>
                   <Column name="Category" Value="D1"/>
              </Row>
              <Row>
                   <Column name="Title" Value="Document 4"/>
                   <Column name="Category" Value="C1"/>
                   <Column name="Category" Value="C2b"/>
              </Row>
              <Row>
                   <Column name="Title" Value="Document 5"/>
                   <Column name="Category" Value="D1"/>
              </Row>
         </Rows>
    </Root>
    Xslt :
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" 
         xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
         <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
     
              <xsl:key name="groups" match="Row" use="Column[@name='Category']/@Value"/>
         <!--     a test merci à suivre  http://www.jenitennison.com/xslt/grouping/#by-content-->
         <xsl:key name="groups2" match="Row" use="./Column/Column[@name='Category']/@Value"/>
     
         <xsl:template match="/">
              <root>
                   <xsl:call-template name="E1"/>
                   <xsl:call-template name="C2b"/>
                   <xsl:call-template name="D1"/>
              </root>
         </xsl:template>
     
         <xsl:template match="Row">
                   <ul>
                        <xsl:for-each select="key('groups', Column[@name='Category']/@Value)">
                             <li>
                                  <xsl:value-of select="Column[@name='Title']/@Value"/>
                             </li>
                        </xsl:for-each>
                   </ul>
     
          </xsl:template>
     
         <xsl:template name="E1">
              <titre>E1</titre>
              <sousTitre>E2b</sousTitre>     
                   <xsl:apply-templates select="Root/Rows/Row[generate-id() = generate-id(key('groups2', 'E2b')[1])]"/>
         </xsl:template>
         <xsl:template name="D1">
              <titre>D1</titre>
              <xsl:apply-templates select="Root/Rows/Row[generate-id() = generate-id(key('groups', 'D1')[1])]"/>
         </xsl:template>
     
     
         <xsl:template name="C2b">
              <titre>C1</titre>
              <sousTitre>C2</sousTitre>
              <xsl:apply-templates select="Root/Rows/Row[generate-id() = generate-id(key('groups2', 'C2b')[1])]"/>
         </xsl:template>
    </xsl:stylesheet>
    Je vais continué à descendre dans l'arbre, je ne sais pas si c'est la meilleur méthode ... à suivre Merci

  5. #5
    Membre à l'essai
    Homme Profil pro
    infographiste
    Inscrit en
    Avril 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : infographiste
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2012
    Messages : 41
    Points : 23
    Points
    23
    Par défaut Problème
    Mais j'ai un problème avec le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:template match="Row">
    à la commande

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:for-each select="key('groups', Column[@name='Category']/@Value)">
    Commet faire pour plusieurs choix de template?

    Merci

  6. #6
    Membre à l'essai
    Homme Profil pro
    infographiste
    Inscrit en
    Avril 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : infographiste
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2012
    Messages : 41
    Points : 23
    Points
    23
    Par défaut
    Utilisation du C'est plus facile !!!

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

Discussions similaires

  1. [XSLT] Regroupement sur base d'éléments de même valeur
    Par clang35 dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 03/12/2008, 14h43
  2. [XSLT]Regroupement par attribut.
    Par zserdtfg dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 08/12/2006, 11h35
  3. [XSLT] Select sur plusieurs attributs
    Par maitrebn dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 28/11/2006, 13h13
  4. [XSLT] boucler sur des attributs
    Par damyrid dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 30/03/2006, 10h43
  5. [XSLT]Sort sur un attribut dont la valeur est en param
    Par Trin dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 07/11/2005, 16h16

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