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 :

Hiérarchisation d'un XML via transformation XSL


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre à l'essai
    Homme Profil pro
    Chef de projet SI
    Inscrit en
    juin 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Chef de projet SI

    Informations forums :
    Inscription : juin 2019
    Messages : 9
    Points : 10
    Points
    10
    Par défaut Hiérarchisation d'un XML via transformation XSL
    Bonjour,
    J'ai un XML sous ce format :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <table>
    	<ligne>
    		<a>1</a>
    		<b>1.1</b>
    	</ligne>
    	<ligne>
    		<a>1</a>
    		<b>1.2</b>
    	</ligne>
    </table>
    Actuellement, je lui applique cette transformation 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
    <?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" indent="yes"/>
    	<xsl:template match="table">
    		<Cs>
    			<xsl:apply-templates/>
    		</Cs>
    	</xsl:template>
    	<xsl:template match="ligne">
    		<C>
    			<A>
    				<xsl:value-of select="a"/>
    			</A>
    			<Bs>
    				<B>
    					<xsl:value-of select="b"/>
    				</B>
    			</Bs>
    		</C>
    	</xsl:template>
    </xsl:stylesheet>
    Ce qui me permet d'obtenir ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?xml version="1.0"?>
    <Cs>
    	<C><A>1</A><Bs><B>1.1</B></Bs></C>
    	<C><A>1</A><Bs><B>1.2</B></Bs></C>
    </Cs>
    Le truc, c'est que je voudrais hiérarchiser les données pour obtenir ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?xml version="1.0"?>
    <Cs>
    	<C><A>1</A><Bs><B>1.1</B><B>1.2</B></Bs></C>
    </Cs>
    Est-ce possible et si oui, quelle serait la transformation XSL à appliquer ?

    Merci d'avance,
    Flophie

  2. #2
    Membre émérite Avatar de tsuji
    Inscrit en
    octobre 2011
    Messages
    1 487
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 1 487
    Points : 2 612
    Points
    2 612
    Par défaut
    Une façon de le faire ...
    Code xslt1 : 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
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" encoding="utf-8" />
    <xsl:key name="agroup" match="a" use="." />
    <xsl:template match="table">
        <Cs>
            <xsl:apply-templates select="ligne/a" />
        </Cs>
    </xsl:template>
    <xsl:template match="a[generate-id()=generate-id(key('agroup', .)[1])]">
        <xsl:variable name="av" select="." />
        <xsl:for-each select="//ligne/b[preceding-sibling::a[1]=$av]">
            <C><A><xsl:value-of select="$av" /></A><Bs><B><xsl:value-of select="." /></B></Bs></C>
        </xsl:for-each>
    </xsl:template>
    <xsl:template match="a" />
    </xsl:stylesheet>

  3. #3
    Membre à l'essai
    Homme Profil pro
    Chef de projet SI
    Inscrit en
    juin 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Chef de projet SI

    Informations forums :
    Inscription : juin 2019
    Messages : 9
    Points : 10
    Points
    10
    Par défaut
    Hello tsuji,
    Merci pour cette réponse que j'ai essayé d'analyser mais malheureusement, je ne comprends pas pourquoi elle me donne 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
    <?xml version="1.0" encoding="utf-8"?>
    <Cs>
      <C>
        <A>1</A>
        <Bs>
          <B>1.1</B>
        </Bs>
      </C>
      <C>
        <A>1</A>
        <Bs>
          <B>1.2</B>
        </Bs>
      </C>
    </Cs>
    Comment faudrait-il faire pour que les valeurs de la balises B soient regoupées par identifiant de la balise A, c'est-à-dire comme ceci :
    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="utf-8"?>
    <Cs>
      <C>
        <A>1</A>
        <Bs>
          <B>1.1</B>
          <B>1.2</B>
        </Bs>
      </C>
    </Cs>
    Merci d'avance,
    Flophie

  4. #4
    Membre émérite Avatar de tsuji
    Inscrit en
    octobre 2011
    Messages
    1 487
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 1 487
    Points : 2 612
    Points
    2 612
    Par défaut
    Oui, simplement replacer les balises.
    Code xslt1 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <xsl:template match="a[generate-id()=generate-id(key('agroup', .)[1])]">
        <xsl:variable name="av" select="." />
        <C>
            <A><xsl:value-of select="$av" /></A>
            <Bs>
                <xsl:for-each select="//ligne/b[preceding-sibling::a[1]=$av]">
                    <B><xsl:value-of select="." /></B>
                </xsl:for-each>
            </Bs>
        </C>
    </xsl:template>

  5. #5
    Membre à l'essai
    Homme Profil pro
    Chef de projet SI
    Inscrit en
    juin 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Chef de projet SI

    Informations forums :
    Inscription : juin 2019
    Messages : 9
    Points : 10
    Points
    10
    Par défaut
    Nickel
    Merci beaucoup !

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

Discussions similaires

  1. Transformation XML via un XSL
    Par dahu17 dans le forum C#
    Réponses: 3
    Dernier message: 11/06/2007, 10h56
  2. [XSLT] Insertion du nom du fichier XML par transformation XSL
    Par stepd dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 11/07/2006, 11h40
  3. [XML][XSLT] transformer le xml en binaire via une xslt
    Par chama dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 25/07/2005, 11h42
  4. transformation xml via xslt
    Par ronnie dans le forum XSL/XSLT/XPATH
    Réponses: 17
    Dernier message: 10/05/2005, 10h58
  5. [XSLT] [XML->HTML] transformation XML -> HTML via XSL
    Par Great Sayaman dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 11/12/2004, 22h12

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