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 des noeuds frêres


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 11
    Points : 8
    Points
    8
    Par défaut [XSLT] Regrouper des noeuds frêres
    Salut à tous,

    J'ai un fichier XML avec la structure suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <noeud type="delimiteur" />
    <noeud type="contenu" />
    <noeud type="contenu" />
    <noeud type="delimiteur" />
    <noeud type="contenu" />
    <noeud type="contenu" />
    que j'aimerais transformer en la structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <noeud type="delimiteur">
                <noeud type="contenu" />
                <noeud type="contenu" />
    </noeud type="delimiteur">
    <noeud type="delimiteur">
                  <noeud type="contenu" />
                  <noeud type="contenu" />
    </noeud type="delimiteur">
    En gros transformer les noeuds avec l'attribut type="contenu" en fils de leur frêre type="délimiteur" précédent.

    J'ai essayé pas mal de choses, mais je n'arrive pas à trouver la syntaxe correcte.

    Une solution serait pour chaque délimiteur d'appeler un template pour tous ses frêres ayant une position plus petite que celle de son prochain frêre délimiteur.
    Savez vous comment récupérer la position d'un noeud non courant ?


    Merci d'avance si vous avez une solution

  2. #2
    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
    C'est le principe de la méthode de muench :
    http://xml.developpez.com/faq/?page=3#xslt_regroup
    Il y a pas mal de ressources dessus sur le net.

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 635
    Points
    21 635
    Par défaut
    Citation Envoyé par Morbo Voir le message
    C'est le principe de la méthode de muench :
    http://xml.developpez.com/faq/?page=3#xslt_regroup
    Il y a pas mal de ressources dessus sur le net.
    Hum. Tu es sûr ?

    Je reconnais que je ne suis pas très doué en XSLT, mais la seule méthode que je trouve pour faire ça, n'a pas grand-chose à voir avec la méthode Muench. Au fond, l'idée de Muench est d'effacer ou fusionner des doublons. Or il n'est pas question de doublon ici.

    Personnellement, je me base à coup de following-sibling dont le premier preceding-sibling délimiteur a le même generate-id() que le délimiteur encadrant.

    Un truc genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    following-sibling::*[@type='contenu'][generate-id(preceding-sibling::*[@type='delimiteur'][1]) = generate-id(current())]

  4. #4
    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
    Oui, autant pour moi, j'ai lu regroupement => muench
    Mais là, c'est en fonction d'un séparateur.

  5. #5
    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 : 48
    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
    non, ce n'est pas du muench par contre on peut produire un code assez simple, et des xpath aussi, en utilisant les xsl:key
    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="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="fils" match="noeud [@type='contenu']" use="generate-id(preceding-sibling::noeud[@type='delimiteur'][1])"/>
    	<xsl:template match="/">
    		<r>
    			<xsl:apply-templates select="//noeud [@type='delimiteur']"/>
    		</r>
    	</xsl:template>
    	<xsl:template match="noeud [@type='contenu']">
    		<xsl:copy-of select="."/>
    	</xsl:template>
    	<xsl:template match="noeud [@type='delimiteur']">
    		<xsl:copy>
    			<xsl:attribute name="type"><xsl:value-of select="@type"/></xsl:attribute>
    			<xsl:apply-templates select="key('fils',generate-id())"/>
    		</xsl:copy>
    	</xsl:template>
    </xsl:stylesheet>

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Merci beaucoup, la solution de Erwy 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. [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 retrouver des noeuds qui n'ont pas un enfant d'un certain type.
    Par Goldenkiller dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 25/08/2008, 11h25
  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