De OOo 1.1.x à XHTML via XSLT
Par Stéphane Bonhomme le jeudi, juin 23 2005, 09:32 - Techno Web - Lien permanent
Voilà donc mon premier article sérieux sur un sujet qui m'intéresse mais qui n'est pas forcément facile d'approche (surtout par la rareté de la documentation de qualité disponible) : transformer du XML en autre chose via XSLT.
J'ai pris l'exemple d'un fichier au format OOo 1.1.x pour "construire" une page au format XHTML 1 strict et ça donne cet article. J'ai choisi de le publier sur le site http://www.scriptsphp.org/ pour plusieurs raisons, la première étant qu'ils en voulaient bien :), mais également c'était une façon de remercier les auteurs de ce site (auquel je participais déjà modérément en temps que relecteur/testeur) qui m'ont permis d'effectuer des tests en ligne sur leur hébergement lorsque mon compte n'était pas encore en PHP5, et qui ont tout simplement testés la XSL et discutés des possibilités.
Un autre article, complétant le premier est prévu, mais je ne sais pas encore quelle forme il aura : des billets? Un long article? Bref, pour ceux qui liront donc l'article que j'ai écrit, merci de me faire part de vos critiques constructives tant sur la forme que sur le fond.
Pour ceux qui se disent : mais est Biophyse? Sachez simplement que ce fichier XSL est destiné (une fois amélioré) à être intégré dans la future version de Biophyse (le premier site arlésien de l'histoire).
Commentaires
Tout cela a l'air très intéressant ! :)
Bonjour Stéphane,
Cet article est très intéressant, et je te remercie de l'avoir écrit. Je te livre ici mes remarque au fil de ma lecture :
A°] De SXW à XML :
Il est possible dans OOo d'enrigtrer une feuille xslt comme filtre d'export, il suffit de donner le fichier xslt, ainsi qu'un nom de filtre dans Outils>Parametrage du filtre XML, il ainsi possible d'appliquer le xslt directement depuis la commande exporter d'openoffice.
(ceci ne résoud pas le problème des images)
C°] L'indication de ce qui est voulu en sortie
L'attribut standalone="yes" est sans effet syi tu précise omit-xml-declaration="yes"
D°] Mise en place de la structure du fichier HTML
tu dis : """Cette ossature de base est mise en place lors de l'appel de la première règle (xsl:template) en l'associant au pattern, c'est à dire la racine du document XML."""
Ce n'est pas tout à fait exact, un pattern, au sens général, permet de désigner un noeud dans le xml source (en utilisant une expressin XPath). la racine du document xml est désignée par le pattern "/"
je dirais : ... en l'associant au pattern "/", c'est à dire...
Sur les styles, tu pourrais dire qu'il est tout à fait possible de mettre une balise <style ... /> dans l'en-tête xhtml pour référencer une feuille de style externe.
E°] La mise en forme
Pour ne traiter que le office:body dans ta feuille de style, tu aurais du mettre : <xsl:apply-template select="office:body"/> dans la règle racine. En effet, s'il y a du contenu textuel dans les autres éléments de plus haut niveau de ton content.xml (par exemple un script dans <office:script/>), celui-ci sera ressorti tel quel dans le doc résultat de la transformation (en l'occurence tout au début du body).
1°) Mise en forme du titre.
<xsl:template match="//text:p"> peut etre avantageusement remplacé par : <xsl:template match="text:p">, ceci est valable pour l'ensemble de tes templates.
Je ne suis pas d'accord avec ta justification de l'usage de la balise <xsl:element> en effet, il est tout à fait possible d'écrire en xslt :
<h3>
<xsl:attribute name="class">
<xsl:text>monStyle</xsl:text>
</xsl:attribute>
<xsl:apply-templates/>
</h3>
<xsl:element> permet plutot d'insérer une balise en dynamisant le nom de la balise, par exemple par l'utilisation d'une variable, d'un parametre ou d'une expression xpath :
<xsl:param name="$balise_titre"/>
<xsl:element name="$balise_titre">....</xsl:element>
(tu utilises d'ailleurs cette possiilité pour les sous-titres)
Tu fais une confusion entre variable et parametres, ainsi qu'entre paramtres globaux et parametres de templates :
les parametres globaux sont passés au processeur par XSLTProcessor::setParameter, et doivent être déclarés dans la feuille de style par un élément <xsl:param name="..."/> placé comme fils direct de xsl:stylesheet.
les parametres de template (ceux que tu utilises dans ta feuille) sont déclarés comme premiers fils de l'element template et permettent de récupérer les parametres passés dans la balise xsl:apply-templates à l'aide de xsl:with-param.
les variables ont une portée restreinte à l'émément dans lequel elles sont définies (elle peuvent définies glabalement en les déclarant directement dans xsl:stylesheet).
2°) Mise en forme des sous-titres.
Ici tu fais un usage détourné de xsl:param, en exploitant le fait que tu peux préciser une valeur par défaut quand le parametre n'est pas passé au template, il serait plus propre d'utiliser <xsl:variable name="level" select="@level+2" /> (il n'est pas nécéssaire d'exprimer le préfixe d'un attribut quand celui-ci appartient au même namespace que la balise qui le porte).
6°) Mise en forme des images
concernant la hauteur et largeure, pour effectuer ces conversions périlleuses, alors que css supporte les unités utilisés par OOo :
<xsl:template match="draw:image">
<img>
...
<xsl:attribute name="style">
<xsl:text>width:</xsl:text>
<xsl:value-of select="@svg:width"/>
<xsl:text>;height:</xsl:text>
<xsl:value-of select="@svg:height"/>
...
</img>
</xsl:template>
8°) Les listes
// Traitement des items de liste
<xsl:template match="//text:list-item">
<xsl:element name="li">
<xsl:value-of select="node()"/>
<xsl:apply-templates />
</xsl:element>
</xsl:template>
Le <xsl:value-of select="node()"/> est en trop ici (coquille ?)
Voila mes principales remarques, j'en ai bien d'autres qui permettrait en particulier d'optimer le xsl (par exemple dans l'adressage des styles en utilisant xsl:key). Mais on pourrait carrément y consacrer un article en entier.
Je te permet bien sur d'intégrer toutes les remarques que je t'ai faites, et de repres enextenso certains passages de ce commentaire pour améliorer ton article. Si tu penses le faire évoluer encore, je peux envisager de contribuer à sa rédaction (en tant que co-auteur pourquoi pas)....
En tout cas bravo pour ce joli travail !
Stéphane.
Merci pour tous ces précieux conseils mon cher homonyme :) !! En prime ça répond à un certain nombre de questions dont je n'avais pas réussi à trouver de réponse convenable :)
Voilà, article et XSL ont été mis à jour en tenant compte de (presque) tout ce qui a été écrit ici et sur le chan, et en changeant 2-3 choses au passage.
Encore merci donc waloo ;)
Hi,
sorry I don´t speak French but I´m very interested in this topic. I tried the example code of the article but didn´t understand much of the explanations. Does anybody know of some more good resources in English or German?
If you are interested in the new file format of OpenOffice.org which is OpenDocument I can recommend this free online book: OASIS OpenDocument Essentials - books.evc-cit.info/
It´s about the file format and how to transform it using XSLT. The author has also written a java application that unpacks and transforms ooo files, it can be found here: books.evc-cit.info/odf_ut...
oerdec