1. #1
    Candidat au Club
    Inscrit en
    avril 2013
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : avril 2013
    Messages : 3
    Points : 2
    Points
    2

    Par défaut XSL : balises imbriquées et noeuds texte

    Salut !

    je possède un document xml que je souhaite convertir en html. La structure étant très spécifique, j'ai écris une feuille de style XSL.

    J'ai un problème pour appliquer proprement les principes de template et donc de récursivité sur un cas particulier. Je vous l'expose :
    Le document XML contient du texte "entouré" de balises pour indiquer son formattage. J'aimerais traduire tout cela en <span>.

    Voici les 3 cas que j'ai


    <varpho>
    <i>salut</i>
    </varpho>
    --> doit devenir en html <span class="corpsItalique">salut</span>


    <varpho>
    <i>
    <b>chien</b>
    -ne
    </i>
    </varpho>
    --> doit devenir en html <span class="corpsGrasItalique">chien</span><span class="corpsItalique"> -ne</span>


    <varpho>
    <i>
    Dict. fra.
    <b>chat</b>
    -chaton
    </i>
    </varpho>
    --> doit devenir en html <span class="corpsItalique">Dict. fra.</span><span class="corpsGrasItalique">chat</span><span class="corpsItalique"> -chaton</span>


    Je n'arrive pas à écrire le template pour générer le code html que je souhaite qui prendrait en compte ces 3 cas.

    J'ai aussi essayé d'avoir les span imbriqués dans le code html. Par exemple, pour le cas 3° d'avoir : <span class="corpsItalique">Dict. fra.<span class="corpsGrasItalique">chat</span> -chaton</span>

    Mais là non plus je n'y arrive pas.

    <xsl:template match="//varpho/i">
    <xsl:if test="./b/text()">
    <span class="grasseItalic">
    <xsl:value-of select="./b/text()"/>
    </span>
    </xsl:if>
    <span class="corpsItalique">
    <xsl:value-of select="./text()"/>
    </span>
    </xsl:template>

    Ce XSL ne fonctionne que pour les cas 1 et 2

    Merci d'avance pour votre aide !!

    Fabrice.

  2. #2
    Membre chevronné
    Inscrit en
    octobre 2011
    Messages
    1 069
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 1 069
    Points : 1 853
    Points
    1 853

    Par défaut

    Je suppose et j'en suis sûr qu'il y a une multiple façon de le faire. Voilà une, modulo des espaces vides sémantiques parfois plus laborieux de les faire distribuers correctement et aux bons endroits. Ces espaces vides sont tous enlevés pourtant ici.
    Code xslt : 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="varpho">
        <xsl:for-each select=".//text()[normalize-space()!='']">
            <xsl:choose>
                <xsl:when test="parent::i">
                    <span class="corpsItalique"><xsl:value-of select="normalize-space()" /></span>
                </xsl:when>
                <xsl:when test="parent::b">
                    <span class="corpsGrasItalique"><xsl:value-of select="normalize-space()" /></span>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="normalize-space()" />
                </xsl:otherwise>
            </xsl:choose>
        </xsl:for-each>
    </xsl:template>

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    septembre 2004
    Messages
    11 201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2004
    Messages : 11 201
    Points : 18 961
    Points
    18 961

    Par défaut

    Ouaip ça manque pas de façons de faire.

    Personnellement j'aime bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <xsl:template match="varpho/i/text()">
      <span class="corpsItalique">
        <xsl:copy/>
      </span>
    </xsl:template>
     
    <xsl:template match="varpho/i/b/text()">
      <span class="corpsGrasItalique">
        <xsl:copy/>
      </span>
    </xsl:template>
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Candidat au Club
    Inscrit en
    avril 2013
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : avril 2013
    Messages : 3
    Points : 2
    Points
    2

    Par défaut


    Super merci beaucoup pour vos réponses ! C'est top !!!

    Je comprend bien la première solution avec le for-each, par contre avec xsl:copy, même avec la doc, je ne comprends pas comment on arrive à obtenir le bon résultat.
    Pour tenter de comprendre, j'ai remplacé <xsl:copy/> par <xsl:value-of select="."/>. ca semble aussi fonctionner Si on peut m'éclairer...

    merci !

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    septembre 2004
    Messages
    11 201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2004
    Messages : 11 201
    Points : 18 961
    Points
    18 961

    Par défaut

    Oui oui les deux marchent et, dans ce contexte, font la même chose.

    C'est juste que copy c'est plus court et plus clair, en fait.

    Dans un cas tu dis "fais-moi une copie" et dans l'autre "alors ici, je veux que tu me mettes la valeur de ce que tu obtiens en évaluant le contexte en cours." Je sais pas mais pour moi "fais-moi une copie" c'est plus simple. Les deux font la même chose, hein, je conteste pas ça.

    Concrètement, ce que veut dire <xsl:copy>, c'est :

    - si le nœud en cours est un élément, insérer un élément de même nom, et à l'intérieur du <xsl:copy> ... </xsl:copy>, définir le contenu de cet élément inséré.
    - si ce n'est pas un élément, insérer une copie exacte du nœud en cours. Donc dans le cas d'un texte, copier le texte.

    On utilise souvent <xsl:copy> pour réaliser des transformations XSLT qui gardent le document d'origine tel quel, mais en ne faisant que quelques modifications à des endroits précis.

    Avec ce template :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:template match="node() | @*">
      <xsl:copy>
        <xsl:apply-templates select="node() | @*"/>
      </xsl:copy>
    </xsl:template>
    On produit une copie conforme de n'importe quel nœud du document. Il ne reste plus qu'à fournir d'autres templates pour transformer les nœuds qu'on ne veut pas garder exactement pareils.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Candidat au Club
    Inscrit en
    avril 2013
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : avril 2013
    Messages : 3
    Points : 2
    Points
    2

    Par défaut

    Simple, clair, merci pour ces explications !

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

Discussions similaires

  1. balises imbriquées avec du texte
    Par sarreyah dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 19/07/2011, 00h23
  2. [XSL 1.0] copie d'un noeud texte d'un document à un autre
    Par Frantz69 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 05/04/2009, 15h20
  3. [XSL] Transformation de balises imbriquées
    Par Janitrix dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 16/05/2008, 13h45
  4. [DOM] Récupérer les noeuds textes descendants d'une balise
    Par hamma2 dans le forum XML
    Réponses: 1
    Dernier message: 30/11/2006, 10h24
  5. [XSL][XHTML] test sur position de noeuds (text() et autres)
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 05/09/2005, 17h47

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