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
    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<img src="images/smilies/icon_mad.gif" border="0" alt="" title=":x" class="inlineimg" />sl="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
    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" xmlnssl="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
    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
    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
    Nickel
    Merci beaucoup !

###raw>template_hook.ano_emploi###