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 noeuds


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Directeur technique
    Inscrit en
    Septembre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 4
    Points : 1
    Points
    1
    Par défaut [XSLT] Regroupement de noeuds
    Bonjour,

    J'ai vraiment beaucoup cherché avant d'en venir à poser la question suivante :

    J'ai un xml qui a cette forme :

    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
     
    <bien>
        <categorie_a>
            <noeud_a>valeur_a</noeud_a>
        </categorie_a>
        <categorie_b>
            <noeud_b>valeur_b</noeud_b>
        </categorie_b>
        <categorie_c>
            <noeud_c>valeur_c</noeud_c>
        </categorie_c>
    </bien>
    <bien>
        <categorie_a>
            <noeud_a>valeur_a</noeud_a>
        </categorie_a>
        <categorie_d>
            <noeud_d>valeur_d</noeud_d>
        </categorie_d>
        <categorie_e>
            <noeud_e>valeur_e</noeud_e>
        </categorie_e>
    </bien>
    En gros, certains noeuds de certaines catégories doivent être regroupé en options afin qu'en sorti on obtienne :

    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
     
    <bien>
        <categorie_a>
            <noeud_a>valeur_a</noeud_a>
        </categorie_a>
        <options>
            <noeud_b>valeur_b</noeud_b>
            <noeud_c>valeur_c</noeud_c>
        <options>
    </bien>
    <bien>
        <categorie_a>
            <noeud_a>valeur_a</noeud_a>
        </categorie_a>
        <options>
            <noeud_d>valeur_d</noeud_d>
            <noeud_e>valeur_e</noeud_e>
        <options>
    </bien>
    J'ai essayé avec des variables mais vu qu'on peut pas les re-modifier cela ne fonctionne pas du tout... Mon xsl ressemble à ca :

    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
     
    <xsl:template match="*">
        <xsl:for-each select="bien">
            <xsl:element name="bien">
                <xsl:apply-templates select="categorie_a" />
                <xsl:apply-templates select="categorie_a" />
            </xsl:element>
        </xsl:for-each>
    </xsl:template>
     
    <xsl:template match="categorie_a">
        <categorie_a>
            <noeud_a><xsl:value-of select="noeud_a"/></noeud_a>
        </categorie_a>
    </xsl:template>
    Ensuite j'ai essayé pas mal de chose avec xpath mais rien ne fonctionne

    J'espère que j'ai été clair :-) Merci !

  2. #2
    Membre actif
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2007
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 199
    Points : 297
    Points
    297
    Par défaut
    hello
    j'ai pas tout compris, mais c'est quoi la règle pour le passage de ton code 1 à 2 ? quand est-ce que les categories doivent devenir des <options> ? dès que ce n'est pas categorie_a ?

    c'est vendredi alors...
    "Chuck Norris a déjà compté jusqu'à l'infini. Deux fois."

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Directeur technique
    Inscrit en
    Septembre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Pas de soucis :-D

    On va se mettre dans le cas pratique

    J'ai des noeuds biens qui décrivent des biens immobiliers

    Quand c'est une vente :

    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
     
    <bien>
        <info_generale>
              <id>1214</id>
        </info_generale>
        <vente>
            <prix>500000</prix>
            <taxe_fonciere>100</taxe_fonciere>
        </vente>
    </bien>
    <bien>
        <info_generale>
              <id>1214</id>
        </info_generale>
        <location>
            <loyer>500</loyer>
            <garantie>100</garantie>
        </vente>
    </bien>
    et moi je veux en sortie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <bien>
        <prestation>vente</prestation>
        <options>
              <taxe_fonciere>100</taxe_fonciere>
        </options>
    </bien>
    <bien>
        <prestation>location</prestation>
        <options>
              <garantie>100</garantie>
        </options>
    </bien>
    En gros j'ai des noeuds que je choisis juste de renommer, traitement basique c'est facile. Et des noeuds que je veux regrouper/renommer dans un noeud général "options"

    C'est mieux?

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Directeur technique
    Inscrit en
    Septembre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Je précise que je peux être compatible xsl1 ou xsl2, c'est un nouveau projet donc je n'ai pas de contrainte de ce coté la...

  5. #5
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 845
    Points
    4 845
    Par défaut
    Citation Envoyé par fabien1909 Voir le message
    Je précise que je peux être compatible xsl1 ou xsl2, c'est un nouveau projet donc je n'ai pas de contrainte de ce coté la...
    Si, ta contrainte c'est que le XPath 1.0 (et donc XSLT 1.0) c'est vraiment pas top comparé au 2.0. Du coup tu n'as pas le choix, tu dois opter pour XSLT 2.0.

    Après pour ton problème, je ne comprends pas pourquoi tu vires des informations (prix, loyer).
    En tout cas ce que tu fais n'est pas un regroupement.

    Moi ce que je vois c'est que tu :
    • vires l'élément info_generale
    • crées un nouvel élément "prestation" en premier fils avec pour valeur le nom de la balise du second fils
    • remplace le second fils avec une balise "options" ne contenant qu'une partie des fils de l'ancienne


    C'est tout à fait faisable avec un traitement générique sauf que pour la dernière partie il faut savoir quoi garder comme fils.

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Directeur technique
    Inscrit en
    Septembre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Exactement ! On est d'accord et globalement pour les traitements simples je n'ai aucun soucis.

    Mais je ne sais pas comment garder un fils pour l'afficher plus tard. Comme si je pouvais stocker dans un tableau options pour l'afficher comme je le souhaite ensuite...

  7. #7
    Membre actif
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2007
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 199
    Points : 297
    Points
    297
    Par défaut
    moi je serai quand même parti sur un for-each-group select="location" et for-each-group select="vente" (en xslt 2)

    en utilisant current-grouping-key() on doit arriver au résultat

    si j'ai le temps j'essaye de faire le code

    edit : current-group() suffit
    "Chuck Norris a déjà compté jusqu'à l'infini. Deux fois."

Discussions similaires

  1. [XSLT] Regrouper des noeuds frêres
    Par topmas dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 16/06/2010, 16h20
  2. [XSLT] regroupement de noeud
    Par noobyyy dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 05/12/2009, 00h15
  3. [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
  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