Retourner aux forums || Retourner au forum Programmation.web

Programmation.web : Problème de transformation xslt.

Posté par Gyro Gearllose () le 17 juin 2008
0
Bonjour. Afin de ne pas réinventer la roue, je définis des éléments html en utilisant l'espace de noms qui va bien dans des fichiers xml. Mais ces fichiers ne comportent pas que des balises classiques html, ils comportent également des éléments dont j'ai besoin. Le problème, c'est comment procéder pour que la feuille de style associée rende les balises html comme il faut, sans y ajouter quoi que ce soit ? Un exemple étant plus parlant, en voici un. Fichier xml :



   Essai
  Voilà une branche


Et voici la feuille xsl :





    

Je ne vois pas trop quoi mettre pour obtenir le rendu de la balise h1 définie dans le fichier xml. J'ai bien essayé divers trucs repris deci-delà sur le grand ternet, comme par exemple un bête dans la feuille de style, sans succès. Le but final serait d'avoir une feuille xsl capable de me reproduire en sortie les tags html définis dans le document xml, tels qu'ils sont, et ce de manière "automatique" (donc éviter de faire un template par balise, car alors, l'utilisation du namespace html devient inutile). Merci par avance pour tout lien, explication que vous pourrez me donner.

--
All articles which are excluded shall be deemed included
Tous les articles exclus sont considérés inclus
--Brian de Palma in Phantom of the Paradize
> Lire le message (5 commentaires, moyenne: 2,4).  

Cette discussion est archivée, il n'est plus possible de laisser des commentaires.

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.

Pfffff.

Posté par Gyro Gearllose () le 17/06/2008 à 13:08. (lien). Évalué à 3.

Bon, je recopie les fichiers, templite à bouffé leur contenu...
le xml :

<?xml version="1.0" encoding="iso-8859-1"?>
<?xml-stylesheet href="e1.xsl" type="text/xsl"?>
<root:racine xmlns:root="http://localhost/root" xmlns:html="http://www.w3.org/1999/xhtml">
<html:h1> Essai</html:h1>
<root:branche>Voilà une branche</root:branche>
</root:racine>


La feuille de style

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:root="http://localhost/root"
xmlns:html="http://www.w3.org/1999/xhtml"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output method="html" version="1.0" encoding="iso-8859-1" doctype-public="-//W3C//DTD XHTML 1.1//EN" doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" indent="yes"/>

<xsl:template match="/root:racine">
<p style="color:red;"><xsl:value-of select="./root:branche" /></p>
</xsl:template>

</xsl:stylesheet>

--
All articles which are excluded shall be deemed included
Tous les articles exclus sont considérés inclus
--Brian de Palma in Phantom of the Paradize
  • [^]Re: Pfffff.

    Posté par Gyro Gearllose () le 17/06/2008 à 13:14. (lien). Évalué à 2.

    Et encore une....
    J'ai bien essayé divers trucs repris deci-delà sur le grand ternet, comme par exemple un "bête" <xsl:apply-templates select="html:h1" /> dans la feuille de style, sans succès.

    --
    All articles which are excluded shall be deemed included
    Tous les articles exclus sont considérés inclus
    --Brian de Palma in Phantom of the Paradize
    • [^]Re: Pfffff.

      Posté par geouille () le 17/06/2008 à 13:39. (lien). Évalué à 2.

      Salut,

      as-tu essayé quelquechose du genre :
      <![CDATA[<h1>]]>
      <xsl:value-of select="html:h1"/>
      <![CDATA[</h1>]]>

      --
      Geraud

      • [^]Re: Pfffff.

        Posté par Gyro Gearllose () le 17/06/2008 à 14:55. (lien). Évalué à 2.

        Bon, ben déjà merci pour ta réponse rapide. Malheureusement, ce n'était pas ça.
        J'ai finalement compris le pourquoi du comment.
        En fait, j'utilise firefox pour afficher le résultat de la transformation xsl, et je pense qu'il comporte quelques bugs (d'autant que j'ai quelques extensions qui peuvent mettre la panique dans le lot, telles que firebug, greasemonkey ou webdevelopper). Mais bref, passons.
        Voici deux fichiers qui fonctionnent et vont me servir de base pour la suite.
        D'abord le fichier xml :

        <?xml version="1.0" encoding="iso-8859-1"?>
        <?xml-stylesheet href="./e1.xsl" type="text/xsl"?>
        <root:racine xmlns:root="http://localhost/root" xmlns:html="http://www.w3.org/1999/xhtml">
        <html:h1> Essai</html:h1>
        <html:h2>Un sous-titre quelconque</html:h2>
        <html:p class="bleu">Voilà un paragraphe</html:p>
        <root:branche>Voilà une branche</root:branche>
        </root:racine>


        Ensuite la feuille de style :

        <?xml version="1.0" encoding="iso-8859-1"?>
        <xsl:stylesheet version="2.0"
        xmlns:root="http://localhost/root"
        xmlns:html="http://www.w3.org/1999/xhtml"
        xmlns="http://www.w3.org/1999/xhtml"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <xsl:output method="html" version="1.0" encoding="iso-8859-1" doctype-public="-//W3C//DTD XHTML 1.1//EN" doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" indent="yes"/>

        <xsl:template match="/root:racine">
        <html>
        <head>
        <title> Essai </title>
        <style type="text/css">
        p {color:yellow}
        h1{color:lightgreen}
        </style>
        </head>
        <body>
        <xsl:apply-templates select="./html:*"/>
        <!--<xsl:apply-templates select="./html:p"/>-->
        <p style="color:red;"><xsl:value-of select="./root:branche" /></p>
        </body>
        </html>
        </xsl:template>

        <xsl:template match="html:*">
        <xsl:copy-of select="." />
        </xsl:template>

        </xsl:stylesheet>



        Alors, quelques explications pour ceux la postérité et pour ceux qui tomberaient sur le même problème que moi.
        D'une, il faut sortir quelque chose avant <xsl:apply-templates select="./html:*"/> sinon, firefox n'applique pas le template. Déjà, ça m'a pris un moment avant de comprendre ça. D'où l'idée de mettre ce qu'il faut pour avoir un document html à peu près bien formé.
        Ensuite, le code se lit de lui-même : pour chaque élément de l'espace de noms html, on applique le template générique qui matche html:*, lequel se contente de recopier l'élément tel quel avec ses attributs.
        Voilà, ça fonctionne, je suis content, je vais pouvoir continuer.
        Merci en tout cas pour ton aide.

        --
        All articles which are excluded shall be deemed included
        Tous les articles exclus sont considérés inclus
        --Brian de Palma in Phantom of the Paradize
    • [^]Re: Pfffff.

      Posté par wismerhill (page perso, ) le 17/06/2008 à 20:02. (lien). Évalué à 3.

      <xsl:apply-templates select="html:h1" />

      C'est pourtant bien ça qu'il faut faire, mais il ne faut pas s'arrêter là, car si tu ne donne pas de template pour gérer ton html:h1 il retombe sur le template par défaut, qui recopie le texte et ignore les éléments.
      Tu peux soit faire directement un xsl:copy-of pour copier l'élément tel quel, soit ajouter un template identité, comme ça

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

      qui aura le même effet, mais permet de modifier sélectivement des éléments avec des templates ciblés.

Revenir en haut de page || Retourner aux forums || Retourner au forum Programmation.web