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 :

[XSL] Transformation de balises imbriquées


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre expert
    Avatar de Janitrix
    Inscrit en
    Octobre 2005
    Messages
    3 391
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 3 391
    Points : 3 401
    Points
    3 401
    Par défaut [XSL] Transformation de balises imbriquées
    Salut,

    Afin de transformer un code de mise en forme XML en sortie HTML, j'ai fait le XSL suivant :
    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0" xmlnssl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output
    method="html"
    encoding="utf-8"
    doctype-public="-//W3C//DTD HTML 4.01//EN"
    doctype-system="http://www.w3.org/TR/html4/strict.dtd"
    indent="yes" />


    <xsl:preserve-space elements="pre | code" />

    <xsl:template match="@*">
    <xsl:copy />
    </xsl:template>

    <xsl:template match="*">
    <xsl:copy>
    <xsl:apply-templates select="* | text() | @*"/>
    </xsl:copy>
    </xsl:template>

    <xsl:template match="article">

    <xsl:apply-templates />

    </xsl:template>

    <xsl:template match="quote">
    <blockquote>
    <xsl:if test="@author ">
    <span class="quote_author">
    <xsl:value-of select="@author" />
    </span> <br />
    </xsl:if>
    <xsl:value-of select="." />
    </blockquote>
    </xsl:template>

    <xsl:template match="bold">

    <strong>
    <xsl:value-of select="." />
    </strong>

    </xsl:template>


    </xsl:stylesheet>
    Donc, avec le XML suivant :
    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE article SYSTEM "validator.dtd">
    <?xml-stylesheet href="template.xsl" type="text/xsl"?>
    <article>
    Bonjour.
    <bold>Gras </bold> <quote> Citation </quote>

    </article>
    J'obtiens ce que je veux. Le problème est lorsque j'ai deux balises imbriquées dans mon XML, comme ceci :
    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE article SYSTEM "validator.dtd">
    <?xml-stylesheet href="template.xsl" type="text/xsl"?>
    <article>
    Bonjour.
    <quote> <bold>Gras </bold> Citation </quote>

    </article>
    En fait, il ne prend pas en compte la deuxième balise, dans ce cas, bold. Donc, avec le XML précédent, j'obtiens :
    <blockquote>Gras Citation </blockquote>
    Alors que j'aimerais :
    <blockquote><strong>Gras</strong> Citation </blockquote>
    Existe t-il un moyen de faire ça avec XSL ? J'ai essayé quelques trucs à partir des tutoriels disponibles mais rien de satisfaisant.

    Merci

  2. #2
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Salut,

    Il suffit de remplacer les <xsl:value-of select="."/> que tu as utilisé dans tes templates "quote" et "bold" par des <xsl:apply-templates />

    Quand tu fais un xsl:value-of, tu envoies directement en sortie la chaîne contenue dans l'élément sélectionné par l'attribut "select" (en ignorant les balises également contenues), et tu interrompts le parcours de ton arbre source. Avec xsl:apply-templates, tu continues la descente recursive dans l'arbre ; le fait de ne pas spécifier d'attribut select fait que ce sont tous les noeuds fils de l'élément courant qui sont sélectionnés (y compris les text nodes), et leurs templates correspondants exécutés. C'est ce qui te permettra d'obtenir cette imbrication d'éléments en sortie.

  3. #3
    Membre expert
    Avatar de Janitrix
    Inscrit en
    Octobre 2005
    Messages
    3 391
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 3 391
    Points : 3 401
    Points
    3 401
    Par défaut
    Parfait c'est nickel

    Merci

    Tu penses que ça vaut une Q/R dans la FAQ ? En tant que débutant, la réponse ne m'est pas venu à l'esprit alors qu'en fait c'est logique

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

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Citation Envoyé par Janitrix Voir le message
    Tu penses que ça vaut une Q/R dans la FAQ ? En tant que débutant, la réponse ne m'est pas venu à l'esprit alors qu'en fait c'est logique
    C'est vrai que c'est une question qui revient de temps à autre.

    Maintenant, ça ne concerne essentiellement que le traitement par XSLT de sources XML modélisant des documents, rarement les autres types de données ; Et puis la difficulté, c'est de lui trouver une forme de Q/R qui soit parlante pour les débutants, parce que si on prend les termes formels la formulation ce serait "comment écrire un template XSL gérant les éléments à contenu mixte et récursif ?". Pas très parlant...

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

Discussions similaires

  1. Comment transformer une balise xml dans une requete xsl:for-each
    Par Max1000p dans le forum XML/XSL et SOAP
    Réponses: 8
    Dernier message: 07/06/2012, 09h46
  2. [XML/XSL] Transformation Excel
    Par Tyler Durden dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 27/11/2003, 21h00
  3. [XSL] insérer une balise <a name>
    Par guibong dans le forum XMLRAD
    Réponses: 2
    Dernier message: 01/08/2003, 15h04
  4. [XSL]faire une balise dans une balise??? (ComboBox)
    Par rastoix dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 23/05/2003, 08h34
  5. [XSLT] inclure du XSL dans une balise html
    Par iaa dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 05/08/2002, 15h57

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