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 de balises


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    maa
    maa est déconnecté
    Membre actif
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Points : 288
    Points
    288
    Par défaut [XSLT] Regroupement de balises
    Bonjour,

    Je cherche à passer d'une structure de ce type :

    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
     
    <Root>
    	<Product Group="group1">
    		<Name>Product1</Name>
    	</Product>
    	<Product Group="group2">
    		<Name>Product2</Name>
    	</Product>
    	<Product Group="group1">
    		<Name>Product3</Name>
    	</Product>
    	<Product Group="group1">
    		<Name>Product4</Name>
    	</Product>
    	<Product Group="group3">
    		<Name>Product5</Name>
    	</Product>
    	<Product Group="group3">
    		<Name>Product6</Name>
    	</Product>
    </Root>
    à une structure comme ceci :

    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
     
    <Root>
    	<Group name="group1">
    		<Product>
    			<Name>Product1</Name>
    		</Product>
    		<Product>
    			<Name>Product3</Name>
    		</Product>
    		<Product>
    			<Name>Product4</Name>
    		</Product>
    	</Group>
    	<Group name="group2">
    		<Product>
    			<Name>Product2</Name>
    		</Product>
    	</Group>
    	<Group name="group3">
    		<Product>
    			<Name>Product5</Name>
    		</Product>
    		<Product>
    			<Name>Product6</Name>
    		</Product>
    	</Group>
    </Root>
    Comme je ne connais pas les noms de mes groupes à l'avance, ni même leur nombre, je ne vois pas comment faire cela en xslt...

    Quelqu'un aurait une idée ?

    merci d'avance.

    mathmax

  2. #2
    maa
    maa est déconnecté
    Membre actif
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Points : 288
    Points
    288
    Par défaut
    J'ai trouvé ceci :



    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    <?xml version="1.0" encoding="UTF-8" ?>
     
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
      <xsl:output indent="yes" />
     
      <xsl:template match="/">
     
        <Root>
     
          <xsl:call-template name="category">
     
            <xsl:with-param name="path" select="Root/Product[@Group]" />
     
          </xsl:call-template>    
     
        </Root>
     
      </xsl:template>
     
     
     
      <xsl:template name="category">
     
        <xsl:param name="path" />
     
        <xsl:param name="category" />
     
        <xsl:variable name="newcat">
     
          <xsl:value-of select="$path/@Group" />
     
        </xsl:variable>
     
        <xsl:if test="$newcat!=$category and (count($path[1]/preceding::Product[@Group=$newcat])=0 or $category='')">
     
          <Group Group="{$newcat}">
     
              <xsl:for-each select="Root/Product[@Group=$newcat]">
     
                <Product>
     
                  <Name>
     
                    <xsl:value-of select="Name"/>
     
                  </Name>
     
                </Product>
     
              </xsl:for-each>
     
          </Group>
     
        </xsl:if>
     
        <xsl:variable name="followingNode" select="$path/following::Product[@Group]" />
     
        <xsl:if test="boolean($followingNode)">
     
          <xsl:call-template name="category">
     
            <xsl:with-param name="path" select="$followingNode" />
     
            <xsl:with-param name="category">
     
              <xsl:value-of select="$newcat" />
     
            </xsl:with-param>
     
          </xsl:call-template>
     
        </xsl:if>
     
      </xsl:template>
     
    </xsl:stylesheet>


    pas très intuitif et assez compliqué pour une chose aussi simple que regrouper des balise... enfin ça marche.
    Je serais quand même intéressé par une meilleure façon de faire. Si les pros du xslt veulent se casser les dents sur ce problème...

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Points : 1 610
    Points
    1 610
    Par défaut
    Salut regarde du coté de la méthode de Muench dans ces cas de figures : http://xml.developpez.com/faq/?page=3#xslt_regroup

  4. #4
    maa
    maa est déconnecté
    Membre actif
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Points : 288
    Points
    288
    Par défaut
    super merci.

    Par contre je comprends pas trop comment ça marche.

    Je vais regarder ça plus en détail...

    Ce que j'aimerais maintenant c'est contrôler l'ordre des Group dans la structure de sortie. En effet je connais le nom de certains d'entre eux et j'aimerais les mettre en premier dans la structure de sortie. Par exemple ici j'aimerais avoir dans l'ordre Group2, Group1, Group3. Peut-on faire cela ?

  5. #5
    maa
    maa est déconnecté
    Membre actif
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Points : 288
    Points
    288
    Par défaut
    Ok pour contrôler l'ordre, je peux écrire ceci :

    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
     
    <?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="regrouper" match="@Group" use="."/>
      <xsl:template match="/">
        <Root>
          <xsl:apply-templates select="Root/Product/@Group[generate-id(.)=generate-id(key('regrouper',.)[1]) and parent::Product/@Group='group2']"/>
          <xsl:apply-templates select="Root/Product/@Group[generate-id(.)=generate-id(key('regrouper',.)[1]) and parent::Product/@Group='group1']"/>
          <xsl:apply-templates select="Root/Product/@Group[generate-id(.)=generate-id(key('regrouper',.)[1]) and parent::Product/@Group='group3']"/>
        </Root>
      </xsl:template>
      <xsl:template match="@Group">
        <Group Name="{.}">
            <xsl:apply-templates select="//Product[@Group=current()]"/>  
        </Group>
      </xsl:template>
      <xsl:template match="Product">
        <xsl:copy-of select="." />
      </xsl:template>
    </xsl:stylesheet>

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

Discussions similaires

  1. [XSLT] Regroupement par id de balise XML
    Par aandre dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 01/12/2010, 13h05
  2. [XSLT] Regroupement balises
    Par toMuch dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 09/09/2010, 16h09
  3. [XSLT] Regrouper des balises pour hiérarchiser
    Par 922374 dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 29/09/2009, 10h42
  4. [XSLT] Regroupement de balises
    Par nadsky dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 03/06/2009, 11h43
  5. [XSLT] regroupement de balises séquentielles
    Par grafikeyes dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 22/11/2007, 13h56

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