Forum Programmation.web Problème de transformation xslt.

Posté par  .
Étiquettes : aucune
0
17
juin
2008

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 :

<?xml version="1.0" encoding="iso-8859-1"?>
<?xml-stylesheet href="e1.xsl" type="text/xsl"?>

Essai
Voilà une branche




Et voici la feuille xsl :


<?xml version="1.0" encoding="iso-8859-1"?>

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">









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.
  • # Pfffff.

    Posté par  . É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>

    • [^] # Re: Pfffff.

      Posté par  . É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.
      • [^] # Re: Pfffff.

        Posté par  (Mastodon) . Évalué à 2.

        Salut,

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

        --
        Geraud
        • [^] # Re: Pfffff.

          Posté par  . É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.
      • [^] # Re: Pfffff.

        Posté par  . É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.

Suivre le flux des commentaires

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