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]Double regroupement [FAQ]


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2
    Points : 1
    Points
    1
    Par défaut [xslt]Double regroupement
    Bonjour,
    J'ai un fichier 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
    <root>
              <row1>
                          <nom>Dupon</nom>
                          <prenom>Paul</prenom>
                          <annee_de_naissance>1980</anne_de_naissance>
               <row1>
               </row2>
                          <nom>Dupon</nom>
                          <prenom>Paul</prenom>
                          <annee_de_naissance>1947</anne_de_naissance>
               </row2>
    <root>
    Et je voudrai obtenir un fichier plat du style :

    Nom de famille : Dupon
    prenom : Paul
    Année de naissance : 1980 1947

    J'arrive bien a regrouper par nom de famille, le problème c'est que ça coince au niveau du second regroupement pour les prenoms.
    Je peu avoir une infinité de ligne ayant le même nom et prenom, celà depend de ce qui est rentré en bdd.
    Auriez vous une idée ?
    Merci.

  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,


    la solution la plus "simple" qui me vienne à l'esprit est un double regroupement avec la méthode Muench :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <xsl:key name="noms" match="nom" use="."/>
    <xsl:key name="prenoms" match="prenom" use="."/>
    ...
    <xsl:for-each select="//nom[generate-id(.) = generate-id(key('noms', .)[1])]">
      <xsl:variable name="nom-courant" select="."/>
      <xsl:text>Nom de famille: </xsl:text><xsl:value-of select="."/>
      <xsl:for-each select="//prenom[(preceding-sibling::nom = $nom-courant) and (generate-id(.) = generate-id(key('prenoms', .)[1]))]">
        <xsl:text>prenom : </xsl:text><xsl:value-of select="."/>
        <xsl:text>Année de naissance : </xsl:text>
        <xsl:for-each select="//annee_de_naissance[(preceding-sibling::nom = $nom-courant) and (preceding-sibling::prenom = current())]">
          <xsl:value-of select="."/><xsl:text> </xsl:text>
        </xsl:for-each>
      </xsl:for-each>
    </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
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci de la réponse !!

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 34
    Points : 39
    Points
    39
    Par défaut
    J'avais un besoin similaire à celui de AelMat donc j'ai utilisé la méthode proposée par Grandfather, mais en effectuant quelques tests avec le code fourni, je m'aperçois qu'il y a un petit souci :

    si 2 personnes ont le même prénom mais pas le même nom, alors le prénom n'apparaitra pas la seconde fois car la clé est déjà attribuée et a déjà été utilisée (ou quelque chose comme ça)

    En effet, quand mon xml est

    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="UTF-8"?>
    <root>
    	<row1>
    		<nom>Dupon</nom>
    		<prenom>Paul</prenom>
    		<annee_de_naissance>1980</annee_de_naissance>
    	</row1>
    	<row2>
    		<nom>Dupon</nom>
    		<prenom>Paul</prenom>
    		<annee_de_naissance>1947</annee_de_naissance>
    	</row2>
    	<row3>
    		<nom>Dup</nom>
    		<prenom>Paul</prenom>
    		<annee_de_naissance>1956</annee_de_naissance>
    	</row3>
    </root>
    j'obtiens en sortie :

    Nom de famille : Dupon
    prenom : Paul
    Année de naissance : 1980 1947
    Nom de famille: Dup

    je n'ai pas le prènom (et donc pas l'année de naissance) de Dup !

    Par contre si je renomme Paul Dup en Pauline Dup, tout est nickel car j'obtiens bien :

    Nom de famille: Dupon
    prenom : Paul
    Année de naissance : 1980 1947
    Nom de famille: Dup
    prenom : Pauline
    Année de naissance : 1956



    Comment éviter ce problème lors de la répétition d'un prénom ?
    Merci de votre aide

  5. #5
    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
    Bien vu Milouse.

    Ca m'apprendra à ne pas tester à fond le code que je poste...
    Voici un algo (semble-t-il) correct :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <xsl:for-each select="//nom[generate-id(.) = generate-id(key('noms', .)[1])]"> 
      <xsl:variable name="nom-courant" select="."/> 
      <xsl:text>Nom de famille: </xsl:text><xsl:value-of select="."/>
      <xsl:for-each select="//prenom[generate-id(.) = generate-id(key('prenoms', .)[preceding-sibling::nom = $nom-courant][1])]"> 
        <xsl:text>prenom : </xsl:text><xsl:value-of select="."/> 
        <xsl:text>Année de naissance : </xsl:text> 
        <xsl:for-each select="//annee_de_naissance[(preceding-sibling::nom = $nom-courant) and (preceding-sibling::prenom = current())]"> 
          <xsl:value-of select="."/><xsl:text> </xsl:text> 
        </xsl:for-each> 
      </xsl:for-each> 
    </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

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 34
    Points : 39
    Points
    39
    Par défaut
    Merci GrandFather pour cette nouvelle solution. Je me doutais bien que tu ne mettrais pas longtemps à corriger ...

Discussions similaires

  1. [AC-2013] Requête avec double regroupement
    Par kesme dans le forum Access
    Réponses: 1
    Dernier message: 20/04/2015, 11h25
  2. 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
  3. XSLT synthèse regroupée par valeurs
    Par raphael75015 dans le forum XSL/XSLT/XPATH
    Réponses: 28
    Dernier message: 03/10/2013, 10h31
  4. [XSLT]Enlever les double espaces
    Par totoen dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 14/12/2005, 13h43
  5. [XSLT]tableau double entrée avec cellule manquante
    Par nferay dans le forum XSL/XSLT/XPATH
    Réponses: 9
    Dernier message: 08/03/2005, 15h07

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