Lien dans XML -> Generation XSL-Fo

Eléphant du PHP | 291 Messages

11 févr. 2008, 22:16

Bien l'bonsoir !
Me voilà pour une nouvelle question, côté XML cette fois.

Voilà j'ai un fichier XML avec du contenu de ce type là :

Code : Tout sélectionner

<root> <element> <content>Coucou venez <a href="foo">ici</a> !</content> </element> </root>

J'ai une feuille XSL qui me génère un fichier HTML. Pour gérer le lien je le met dans CDATA et ça marche. Par contre, pour générer un PDF, je ne sais pas comment faire pour mettre en forme ce lien.
J'utilise pour cela XSL-Fo, mais à l'affichage j'ai toujours "<a href="foo">ici</a>" (pas interprété, normal...)

Quelles sont les solutions pour rémédier au problème ?

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

13 févr. 2008, 23:49

Ce que tu fais n'est pas conforme à la norme XML. Il ne faut pas intégrer de balises HTML dans la structure de données XML.

Voici comment normaliser tout ça par l'exemple :

Source XML: test.xml

Code : Tout sélectionner

<?xml version="1.0" encoding="UTF-8"?> <!-- Document : test.xml Created on : 13 février 2008, 20:13 Author : sadeq Description: données imaginaires pour le test --> <root> <eleve> <nom>Dupont</nom> <prenom>Jean-pierre</prenom> <cv link="cv_jeanpierre_Dupont.htm">Consultez CV</cv> </eleve> <eleve> <nom>Durand</nom> <prenom>Aline</prenom> <cv link="cv_aline_Durand.htm">Consultez CV</cv> </eleve> <eleve> <nom>Leroy</nom> <prenom>Marc</prenom> <cv link="cv_marc_leroy.htm">Consultez CV</cv> </eleve> </root>
Présentation XSL: test.xsl

Code : Tout sélectionner

<?xml version="1.0" encoding="UTF-8"?> <!-- Document : test.xsl Created on : 13 février 2008, 20:17 Author : sadeq Description: programme xsl affichant les données XML en HTML --> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="html"/> <xsl:template match="root"> <html> <head> <title>Liste des élèves</title> </head> <body> <h1>Liste des élèves</h1><hr /> <xsl:for-each select="eleve"> <p>Nom : <xsl:value-of select="nom" /></p> <p>Prénom : <xsl:value-of select="prenom" /></p> <xsl:for-each select="cv"> <xsl:element name="a"> <xsl:attribute name="href"> <xsl:value-of select="@link" disable-output-escaping="yes" /> </xsl:attribute> <xsl:value-of select="." /> </xsl:element> </xsl:for-each> <hr /> </xsl:for-each> </body> </html> </xsl:template> </xsl:stylesheet>
Il suffit maintenant de faire le parsing Xml/Xsl pour obtenir HTML.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 291 Messages

14 févr. 2008, 00:42

Tiens, c'est rigolo, je viens justement de -presque- finir un outil de gestion de CV basé sur XML ;)

La solution que tu proposes ne convient pas ici, car l'utilisateur pourra[it] décider de mettre des liens dans un champ texte, au beau milieu, sans que necessaire tout le contenu soit un texte... J'ai écrit une DTD parfaitement valide, et les documents XML répondent à cette DTD, mais je ne veux pas compliquer la vie de l'utilisateur.

Et la génération depuis XSL ne pose pas de problème, c'est juste que je cherche à éviter la solution du PCDATA, sans pour autant obliger l'utilisateur à écrire :

Code : Tout sélectionner

<root> <content> <description>bon bah voila un debut de</description> <description url="foo">texte coupé au milieu</description> <description>juste pour mettre un lien, et en reduisant la cohérence du contenu et des balises</description> </content> </root>
Merci d'avoir pris le temps de répondre, mais ça ne répond à ce que cherche :-(
Cette question est un vrai problème évoqué sur XMLFR et newsgroups associés, mais dans des topics peu récents, donc je ne sais pas si on a maintenant des "solutions miracles" ...

Donc si quelqu'un a une autre idée...