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] Transformation récursive de paragraphes imbriqués


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 4
    Par défaut [XSLT] Transformation récursive de paragraphes imbriqués
    Salut à tous !


    Me heurtant à un mur en tentant de développer un petit truc en <gras>XML/XSL</gras> sympa pour mes cours, je viens quérir votre aide !
    Voilà le topo : je dois rédiger un texte d'une dizaine de pages et comme je n'aime pas le travail mal fait j'ai décidé de me pourvoir d'une structure de données arborescente.

    Le code XML

    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
    <racine>
            <paragraphe titre="P1">
                    <paragraphe titre="P11">
                            P11
                    </paragraphe>
                    <paragraphe titre="P12">
                            <paragraphe titre="P121">
                                    <paragraphe titre="P1211">
                                            P1211
                                    </paragraphe>
                            </paragraphe>
                    </paragraphe>
            </paragraphe>
            <paragraphe titre="P2">
                    P2
            </paragraphe>
    </racine>

    Rendu Souhaité

    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
    <p>
            <h1>Titre P1</h1>
            <p>
                <h2>Titre P11</h2>
                <p>
                    P11
                </p>
                <h2>Titre P12</h2>
                <p>
                    <h3>Titre P121</h3>
                    <p>
                        <h4>Titre P1211</h4>
                        <p>
                            P1211
                        </p>
                    </p>
                    </p>
            </p>
            <h1>Titre P2</h1>
            <p>
                P2
            </p>
    </p>

    Restrictions

    • Les balises de titre doivent aller de h1 à h6
    • Au delà de h6 remplacer la balise de titre par un <div class="titreParagraphe"></div>
    • Si l'attribut titre est vide alors ne pas afficher de titre ni de balise de titre



    Côté XSL

    Etant débutant et les docs sur le web étant ce qu'elles sont, je n'ai pas réussi à parvenir à quelque chose qui s'approcherait de ce que je souhaite.
    Voilà quand même où j'en suis (le code provoque des erreurs)

    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
    24
    25
    26
    27
    28
    29
    30
    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
            <xsl:output method="html" indent="yes" omit-xml-declaration="yes" encoding="utf-8" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" />
     
            <xsl:template match="/">
                    <xsl:for-each select="paragraphe">
                            <xsl:call-templates name="par">
                                    <xsl:with-param name="lvl" value="1" />
                                    <xsl:with-param name="elem" value="." />
                            </xsl:call-templates>
                    </xsl:for-each>
            </xsl:template>
     
            <xsl:template name="par">
                    <xsl:param name="lvl" />
                    <xsl:param name="elem" />
                    <xsl:element name="h{$lvl}">
                            <xsl:value_of select="{$lvl}/@titre" />
                    </xsl:element>
                    <p>
                            <xsl:for-each select="{$elem}/paragraphe">
                                    <xsl:call-templates name="par">
                                            <xsl:with-param name="lvl" value="{$lvl}+1" />
                                            <xsl:with-param name="elem" value="." />
                                    </xsl:call-templates>
                            </xsl:for-each>
                    </p>
            </xsl:template>
     
    </xsl:stylesheet>



    Merci d'avance !

    PS : S'il vous faut des précisions je les donnerai dès que possible
    PPS : Si vous voyez une faute de frappe dans le code ne me dîtes pas que l'erreur vient de là, c'est pas le cas

  2. #2
    Futur Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 4
    Par défaut
    Finalement après des heures de cassage de crâne et d'étude de sources diverses dispo sur votre forum.
    Ca peut servir à d'autres donc voilà la solution :

    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
    24
    25
    26
    27
    28
    29
    30
    31
    	<xsl:template name="main">
    		<xsl:for-each select="/racine/paragraphe">
    			<xsl:call-template name="par">
    				<xsl:with-param name="lvl" select="1" />
    				<xsl:with-param name="node" select="." />
    			</xsl:call-template>
    		</xsl:for-each>
    	</xsl:template>
     
    	<xsl:template name="par">
    		<xsl:param name="lvl" />
    		<xsl:param name="node" />
    		<xsl:if test="$node/@titre != ''">
    			<xsl:element name="h{$lvl}">
    				<xsl:value-of select="$node/@titre" />
    			</xsl:element>
      		</xsl:if>
    		<p>
    			<xsl:if test="count($node/paragraphe) != 0">
    				<xsl:for-each select="$node/paragraphe">
    					<xsl:call-template name="par">
    						<xsl:with-param name="lvl" select="$lvl + 1" />
    						<xsl:with-param name="node" select="." />
    					</xsl:call-template>
    				</xsl:for-each>
    			</xsl:if>
    			<xsl:if test="count($node/paragraphe) = 0">
    			    <xsl:apply-templates select="." />
    			</xsl:if>
    		</p>
    	</xsl:template>

  3. #3
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Bonjour,

    il y a bien plus simple :
    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
    24
    25
    <?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:template match="racine">
    		<p>
    			<xsl:apply-templates select="*"/>
    		</p>
    	</xsl:template>
    	<xsl:template match="paragraphe">
    		<xsl:variable name="niveau" select="count(ancestor-or-self::paragraphe)"/>
    		<xsl:if test="@titre != ''">		
    			<xsl:choose>
    				<xsl:when test="$niveau &gt; 6">
    					<div class="titreParagraphe"><xsl:value-of select="@titre"/></div>
    				</xsl:when>
    				<xsl:otherwise>
    					<xsl:element name="h{$niveau}"><xsl:value-of select="@titre"/></xsl:element>
    				</xsl:otherwise>
    			</xsl:choose>
    		</xsl:if>		
    		<p>
    			<xsl:apply-templates/>
    		</p>
    	</xsl:template>
    </xsl:stylesheet>
    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

  4. #4
    Futur Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 4
    Par défaut
    Waouh encore mieux !

    Merci beaucoup !

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

Discussions similaires

  1. [XSLT]Transformation d'images
    Par boleduch dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 10/10/2005, 14h03
  2. [XSLT]Transformer une partie d'un document
    Par Floyd dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 02/10/2005, 14h03
  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. [XSLT] transformation XHTML->XML
    Par yos dans le forum XSL/XSLT/XPATH
    Réponses: 11
    Dernier message: 23/05/2005, 13h15
  5. [XSLT] transformation XML->XML en php
    Par amellouki dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 03/03/2005, 12h32

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