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] Regrouper les noeuds qui se ressemblent [FAQ]


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    yos
    yos est déconnecté
    Membre du Club
    Inscrit en
    Mai 2005
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 140
    Points : 60
    Points
    60
    Par défaut [XSLT] Regrouper les noeuds qui se ressemblent
    Bonjour,
    Comment regrouper les noeuds en fonction de leurs éléments qui se ressemblent ?
    Avec un exemple je serais plus claire :
    voici un exemple d'XML :
    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
    <Import>
    	<Row>
    	 <Nom>Noir</Nom>
    	 <REF>241164</REF>		
    	</Row>
    	<Row>
    	 <Nom>blanc</Nom>
    	 <REF>241165</REF>		
    	</Row>
    	<Row>
    	 <Nom>blanc</Nom>
    	 <REF>241166</REF>		
    	</Row>
    	<Row>
    	 <Nom>Noir</Nom>
    	 <REF>491255</REF>
    	</Row>
            <Row>
    	 <Nom>Jaune</Nom>
    	 <REF>491235</REF>
    	</Row>
     
    </Import>
    j'aimerai obtenir le résultat suivant :
    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
    <doc>
    	<row>
    	 <url>Noir</url>
    	 <REF>241164</REF>
    	 <REF>491255</REF>
    	</row>
    	<row>
    	 <url>blanc</url>
    	 <REF>241165</REF>
    	 <REF>241166</REF>
    	</row>
    	<row>
    	 <url>Jaune</url>
    	 <REF>491235</REF>
    	</row>
    </doc>
    merci

  2. #2
    yos
    yos est déconnecté
    Membre du Club
    Inscrit en
    Mai 2005
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 140
    Points : 60
    Points
    60
    Par défaut
    Le problème est résolu avec "for-each-group" (xslt version 2.0)
    Voici l'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
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    	<xsl:output method="xml" indent="yes"/>
    	<xsl:template match="/">
    	  <doc>
    	     <xsl:for-each-group select="//Row" group-by="Nom">
    	       <row>
    		<url>
    		   <xsl:value-of select="Nom"/>
    		</url>
    		<xsl:apply-templates select="current-group()"/>
    	         </row>
    	      </xsl:for-each-group>
    	   </doc>
    	</xsl:template>
    	<xsl:template match="*">
    	  <REF>
    	   <xsl:value-of select="REF"/>
    	  </REF>
    	</xsl:template>
    </xsl:stylesheet>
    j'essay maintenant avec la version 1.0 sans "for-each-group"
    merci pour votre aide

  3. #3
    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 : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927

  4. #4
    yos
    yos est déconnecté
    Membre du Club
    Inscrit en
    Mai 2005
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 140
    Points : 60
    Points
    60
    Par défaut
    Merci Erwy effectivement la méthode Muench ...

    J'ai adapté la solution proposé par 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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    	<xsl:output method="xml" indent="yes"/>
    		    <xsl:key name="noms" match="Nom" use="."/>
    		<xsl:key name="ref" match="REF" use="."/>
    	<xsl:template match="/">		
     
    	  <doc>
     
    		<xsl:for-each select="//Nom[generate-id(.) = generate-id(key('noms', .)[1])]"> 
    		  <xsl:variable name="nom" select="."/> 
    		  <xsl:element name="Row">
     
    		  <xsl:element name="Nom">
    		  <xsl:value-of select="."/></xsl:element>
     
     
    		  <xsl:for-each select="//REF[generate-id(.) = generate-id(key('ref', .)[preceding-sibling::Nom = $nom][1])]"> 
     
     
    			<xsl:element name="REF"><xsl:value-of select="."/> </xsl:element>
     
     
    		  </xsl:for-each> 
    		  </xsl:element>
     
     
    		</xsl:for-each>
    	   </doc>
     
     
    	</xsl:template>
     
    </xsl:stylesheet>
    merci à tous

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 27/10/2011, 15h54
  2. [XSLT] Regrouper les noeuds en fonction d'un attribut
    Par Creuvard dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 11/12/2008, 11h31
  3. [XSLT] Transformer les noeuds enfants en attribut du premier noeud
    Par le_chomeur dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 22/02/2008, 13h57
  4. Regrouper les cellules qui ont un contenu identique
    Par Iloon dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 16/01/2008, 14h26
  5. [XSLT] regrouper des noeuds identiques
    Par DelphLaga dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 14/11/2006, 17h07

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