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 en fonction d'un attribut


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 48
    Points : 20
    Points
    20
    Par défaut [XSLT] Regrouper les noeuds en fonction d'un attribut
    Bonjour à toutes et à tous.

    Dans un fichier XML, j'aimerais regrouper les noeuds en fonction d'un attribut (Ici l'attribut @sha1).

    Fichier 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
     
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <database>
      <file sha1="179f40">
        <server host="192.168.0.1" port="4672" bandwidth="300"/>
      </file>
     
      <file sha1="279f40">
        <server host="192.168.0.1" port="1664" bandwidth="300"/>
      </file>
     
      <file sha1="179f40">
        <server host="192.168.0.5" port="1664" bandwidth="300"/>
      </file>
     
      <file sha1="279f40">
        <server host="192.168.0.5" port="4672" bandwidth="300"/>
      </file>
    </database>
    Fichier XML de sortie souhaité:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <database>
      <file sha1="179f40">
        <server host="192.168.0.1" port="4672" bandwidth="300"/>
        <server host="192.168.0.5" port="1664" bandwidth="300"/>
      </file>
     
      <file sha1="279f40">
        <server host="192.168.0.1" port="1664" bandwidth="300"/>
        <server host="192.168.0.5" port="4672" bandwidth="300"/>
      </file>
    </database>

    Je me suis inspiré de l'exemple donné dans la FAQ (Comment regrouper les noeuds en fonction de leurs éléments qui se ressemblent) pour faire ma feuille de style XSL.

    Fichier XSL :
    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
     
    <?xml version="1.0" encoding="ISO-8859-1"?>
      <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:output method="xml" version="1.0" encoding="ISO-8859-1" indent="yes" cdata-section-elements="title" />
      <xsl:key name="regrouper" match="file" use="@sha1"/>
     
      <xsl:template match="/">
    	<database>
    	  <xsl:apply-templates select="database/file[generate-id(.)=generate-id(key('regrouper', @sha1)[1])]"/>
    	</database>
      </xsl:template>
     
      <xsl:template match="file">
    	<xsl:copy-of select="."/>
    	<xsl:apply-templates select="//server[../file=current()]"/> 
      </xsl:template>
     
     
      <xsl:template match="server">
    	  <xsl:copy-of select="."/>
      </xsl:template>
     
    </xsl:stylesheet>
    Voici le résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <database>
      <file sha1="179f40">
        <server host="192.168.0.1" port="4672" bandwidth="300"/>
      </file>
      <file sha1="279f40">
        <server host="192.168.0.1" port="1664" bandwidth="300"/>
      </file>
    </database>
    J'obtient bien le premier serveur, mais pas le second.
    J'imagine que l'un de mes problème ce situe sur la ligne suivante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <xsl:apply-templates select="//server[../file=current()]"/>
    J'ai trouvé un post résolu qui semble traiter du même problème, mais sans parvenir à tous comprendre.

    Merci de voter aide

  2. #2
    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
    Par défaut
    Citation Envoyé par Creuvard Voir le message
    J'obtient bien le premier serveur, mais pas le second.
    J'imagine que l'un de mes problème ce situe sur la ligne suivante.

    tu as bien identifié la source de ton problème, ce qui est rigolo c'est que tu as très bien fait ta clé et pas vu ton erreur ici.

    Le regroupement ne se fait pas sur file mais sur son attribut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <xsl:apply-templates select="//server[../file/@sha1=current()/@sha1]"/>

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 48
    Points : 20
    Points
    20
    Par défaut
    Bonjour,

    J'ai donc modifié ma feuille xsl en remplacant la ligne qui va bien:
    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
     
    <?xml version="1.0" encoding="ISO-8859-1"?>
      <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:output method="xml" version="1.0" encoding="ISO-8859-1" indent="yes" cdata-section-elements="title" />
      <xsl:key name="regrouper" match="file" use="@sha1"/>
      <xsl:template match="/">
    	<database>
    	  <xsl:apply-templates select="database/file[generate-id(.)=generate-id(key('regrouper', @sha1)[1])]"/>
    	</database>
      </xsl:template>
     
     
      <xsl:template match="file">
     
    	<xsl:apply-templates select="//server[../file/@sha1=current()/@sha1]"/>
     
    	<xsl:copy-of select="."/>
     
      </xsl:template>
     
      <xsl:template match="server">
    	  <xsl:copy-of select="."/>
      </xsl:template>
    </xsl:stylesheet>
    Le résultat que j'obtient reste identique que précédement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <database>
      <file sha1="179f40">
        <server host="192.168.0.1" port="4672" bandwidth="300"/>
      </file>
      <file sha1="279f40">
        <server host="192.168.0.1" port="1664" bandwidth="300"/>
      </file>
    </database>

    Merci de voter aide

  4. #4
    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
    Par défaut
    il y avait deux erreurs
    1) avec le .. il ne fallait pas mettre le file
    2) je n'avais pas fait attention mai il ne faillait surtout pas utiliser un copy-of dans le template file
    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
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output method="xml" version="1.0" encoding="ISO-8859-1" indent="yes" cdata-section-elements="title"/>
    	<xsl:key name="regrouper" match="file" use="@sha1"/>
    	<xsl:template match="/">
    		<database>
    			<xsl:apply-templates select="database/file[generate-id(.)=generate-id(key('regrouper', @sha1)[1])]"/>
    		</database>
    	</xsl:template>
    	<xsl:template match="file">
    		<file sha1="{@sha1}">
    			<xsl:apply-templates select="//server[../@sha1=current()/@sha1]"/>
    		</file>
    	</xsl:template>
    	<xsl:template match="server">
    		<xsl:copy-of select="."/>
    	</xsl:template>
    </xsl:stylesheet>

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 48
    Points : 20
    Points
    20
    Par défaut
    Merci pour ton aide Erwy ca marche parfaitement.

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

Discussions similaires

  1. XSLT - Trier/regrouper des noeuds en fonction de leur position
    Par Rackamm dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 10/03/2014, 15h58
  2. Réponses: 5
    Dernier message: 27/10/2011, 15h54
  3. Regrouper les procédures et fonctions
    Par yuan dans le forum ASP.NET
    Réponses: 3
    Dernier message: 08/08/2007, 15h17
  4. [XSLT] regrouper des noeuds identiques
    Par DelphLaga dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 14/11/2006, 17h07
  5. [XSLT] Regrouper les noeuds qui se ressemblent
    Par yos dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 19/10/2006, 16h51

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