Code HTML dans un fichier XML

Petit nouveau ! | 5 Messages

30 nov. 2006, 11:16

Bonjour,

Mon problème conserne la transformation d'un fichier XML et XSL.

J'ai dans mon code XML du code Html de mise en forme. Ex :

Code : Tout sélectionner

... <description> <![CDATA[ ligne 1 <br/> ligne 2 ]]> </description> ...
Or aprés la transformation l'affichage dans un navigateur ne tient pas compte de la balise <br/> et affiche :

Code : Tout sélectionner

... ligne 1 <br/> ligne 2 ...
Mon objectif étant d'afficher :

Code : Tout sélectionner

... ligne 1 ligne 2 ...
J'ai épuisé toutes mes pistes de recherche si quelqu'un à une idée d'avance merci.

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

30 nov. 2006, 14:46

Ça doit paraître idiot mais comme ça à froid je dirais "vire les CDATA qui ne servent à rien et ça devrait marcher" ? CDATA signifie "ce qui suit ne doit pas être interprété" donc c'est relativement logique qu'il l'affiche tel quel.

Si ça ne marche toujours pas, assure-toi que tu possèdes une ligne qui ressemble à

Code : Tout sélectionner

<xsl:output method="html" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>

Petit nouveau ! | 5 Messages

30 nov. 2006, 16:59

Merci de ta réponse.

J'ai supprimé le CDATA mais pas de changement.

En fait si dans mon fichier xml je place la balise html <br> je suis alors obligé d'ajouter le CDATA pour que mon fichier soit correct. Mais alors l'affichage est :
ligne 1 <br> ligne 2
Car lors de la transformation le <br> devient <br>

Si je sors le CDATA il faut alors utiliser la balise <br/> qui donne l'affichage suivant :
ligne 1 ligne 2

J'ai ensuite rajouter la ligne :
<xsl:output method="html" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>
Mais sans succés.

Je pense donc que j'utilise mal la transformation. Faut obligatoirment respecter le standard xhtml pour ce genre de problème ?

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

01 déc. 2006, 00:53

J'avais mal lu ton post, je n'avais pas à l'esprit que ta balise <br /> était dans le fichier XML. Dans ce cas, je doute que tu parviennes à faire quoi que ce soit avec un <br> (illégal en XML) et même un <br /> ne sera pas interprété comme du HTML en fait. Même si le sujet m'intéresse, je ne suis pas un spécialiste en XSL, si personne ne parvient à t'aider ici regarde du côté d'Alsacréations ou Développez.com

Donc pour ton problème actuel, il ne faut pas utiliser CDATA car ça enlève le "sens" de ta balise. Ensuite, il faut comprendre que les noms des balises de ton fichier XML n'ont rien à voir avec le nom des balises HTML. Ton fichier est un fichier XML, pas HTML et il faut essayer de garder la distinction en tête (mais moi-même je n'y arrive pas tout le temps). Donc comme on a dit, c'est du XML, et en XML et bien <br /> n'a aucune fonction particulière, pas plus que <maison> ou <contenu>. Il faut indiquer à XSL que les balises XML <br /> doivent être remplacée par du HTML lors de la transformation. Voici un exemple rapide:
test.xml

Code : Tout sélectionner

<?xml version="1.0" encoding="utf-8" ?> <?xml-stylesheet type="text/xsl" href="test.xsl" ?> <page> Ligne 1<br /> Ligne 2<retour /> Ligne 3<br>mon contenu est ignoré</br> Ligne 4<retour>mon contenu est affiché</retour> </page>
test.xsl

Code : Tout sélectionner

<?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" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/> <xsl:template match="/"> <html> <head> <title>Titre de la page</title> </head> <body> <xsl:apply-templates /> </body> </html> </xsl:template> <xsl:template match="br"> <i>(ceci est un retour à la ligne)</i><br /> </xsl:template> <xsl:template match="retour"> <i>(ceci est un retour à la ligne, voici le contenu de la balise: &apos;<xsl:apply-templates />&apos;)</i><br /> </xsl:template> </xsl:stylesheet>
Comme tu peux le voir, le nom des balises du fichier test.xml importe peu, et tu peux très bien appeler tes <br /> "retour" si tu préfères. Donc pour chaque balise utilisée dans le fichier XML il faudra indiquer le HTML correspondant dans le fichier XSL. En gros, si ton fichier XML contient du HTML tu vas te retrouver à recopier toutes les balises, par exemple

Code : Tout sélectionner

<xsl:template match="b"><b><xsl:apply-templates /></b></xsl:template> <xsl:template match="i"><i><xsl:apply-templates /></i></xsl:template> <xsl:template match="u"><u><xsl:apply-templates /></u></xsl:template> <xsl:template match="p"><p><xsl:apply-templates /></p></xsl:template>
À noter l'utilisation de <xsl:apply-templates /> qui est remplacé par le contenu de la balise et applique les autres templates au contenu.

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

01 déc. 2006, 01:04

Et au cas où ça se présente, voici comment réutiliser les attributs d'une balise XML pour la transformation en XHTML:

Code : Tout sélectionner

<xsl:template match="img"><img src="{@src}" alt="{@alt}" /></xsl:template>
On utilise simplement {@nom_de_l_attribut}. Et en imaginant que tu préfères utiliser ton propre "pseudo-HTML" dans le fichier XML, par exemple:

Code : Tout sélectionner

<image adresse="http://www.google.com/intl/en_ALL/images/logo.gif" />
ça donne

Code : Tout sélectionner

<xsl:template match="image"><img src="{@adresse}" /></xsl:template>