Les filtres XML sous OpenOffice (OOo)

Fichier XSL d'import

1 - Préambule

Ce fichier permet au filtre de faire la correspondance entre les balises du fichier XML et les styles à appliquer au contenu de ce dernier. Ce document au format XSL permet donc parser le fichier source afin de le transformer en un fichier OOo. Il est donc nécessaire de connaître les rudiments du langage XSL pour créer un fichier de ce type. Je vous conseille le site suivant sur ce sujet : http://www.w3schools.com/xsl/.

2 - Structure du document

Le document se présente comme un fichier XSL standard. Il suffit simplement de préciser la méthode de sortie (xml) ainsi que le type mime du fichier résultat (application/vnd.sun.xml.writer).


<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="iso-8859-1" indent="yes"
            media-type="application/vnd.sun.xml.writer" />
   <xsl:template match="/">
      <xsl:element name="office:document">
         <office:meta>
            <dc:title>
               <xsl:value-of select="//titre"/>
            </dc:title>
         </office:meta>
         <office:automatic-styles>   </office:automatic-styles>
         <office:master-styles>
            <style:master-page style:name="Standard"
               style:page-master-name="Nom de la page"/>
         </office:master-styles>
         <office:body>
            <xsl:apply-templates/>
         </office:body>
      </xsl:element>
   </xsl:template>
   ...
</xsl:stylesheet>

Dans cet exemple les styles automatiques ne sont pas traités. Seul le titre du document est traité pour la partie commentaire (meta). Il est possible d'en gérer d'avantage. Ils servent par exemple à définir les attributs d'un document OOo (l'auteur, le titre, etc.).

Voici une liste non exhaustive des commentaires intéressants à gérer :

Pour obtenir la liste complète des noms des balises utilisées dans les documents OpenOffice, se référer à la spécification du format XML sous OOo à la page suivante, section informations générales : http://xml.openoffice.org/.

Grâce à ces quelques lignes, le document XML sera ouvert sous OpenOffice dans une nouvelle page utilisant le style de page prédéfini Standard.

Pour la suite du fichier d'import, il suffit de respecter un template. Ce template permet de créer une partie spécifique du fichier de sortie (section, paragraphe, etc.). Ce template à la forme suivante :

Exemple de template :


<xsl:template match="Balise">
   <xsl:element name="Type de partie">
      <xsl:attribute name="text:style-name">Nom du style</xsl:attribute>
      <xsl:apply-templates/>
   </xsl:element>
</xsl:template>

3 - Liste des parties d'un fichier

Voici la liste des différentes parties d'un fichier OOo qu'il est possible de créer lors de l'import (vous trouverez la liste complète dans le fichier de spécification XML d'OpenOffice) :

Nom de la balise Description
text:section Permet de créer une section.
text:p Permet de créer un paragraphe.
text:span Permet de créer une portion de texte (plusieurs mots).
text:unordered-list Permet de créer une liste non ordonnée.
text:ordered-list Permet de créer une liste ordonnée.

4 - Création d'une section

OpenOffice utilise des sections pour séparer plusieurs parties d'un document. J'utilise des sections lorsqu'il y a plusieurs balises d'imbriquées. Voici un exemple de template pour en créer une à chaque fois qu'une balise portera la nom de bloc dans le fichier XML. Cette section aura pour style Bloc. OpenOffice n'autorise qu'une seule section du même nom. Afin de palier à ce problème, j'ai ajouté une fonction XSL qui compte le nombre de balise du même nom. Son résultat est concaténé au nom de la section créée.


<xsl:template match="bloc">
   <xsl:element name="text:section">
      <xsl:attribute name="text:style-name">Bloc</xsl:attribute>
      <xsl:attribute name="text:name">
         <xsl:text>Bloc_</xsl:text>
         <xsl:value-of select="count(preceding::bloc)"/>
      </xsl:attribute>
      <xsl:apply-templates/>
   </xsl:element>
</xsl:template>

Le style Bloc doit être présent parmi la liste des styles de paragraphe de votre document template.

5 - Création d'un paragraphe

Un document OOo est essentiellement composé de paragraphes. Pour en créer, il suffit d'ajouter un élément XSL portant le nom text:p. Dans cet exemple, le style Annee sera appliqué à tout le contenu de la balise annee. Bien entendu, cela implique que ce style existe dans le fichier template de styles. Afin d'améliorer la lisibilité finale du document, j'ajoute des informations non présentes dans le fichier source. Par exemple ici je récupère le numéro d'année de la promotion, pour plus de clarté, j'y ajoute le nom de la filière (IR).


<xsl:template match="annee">
   <xsl:element name="text:p">
      <xsl:attribute name="text:style-name">Annee</xsl:attribute>
         <xsl:text disable-output-escaping="yes">IR </xsl:text>
      <xsl:apply-templates/>
   </xsl:element>
</xsl:template>

Le style Annee doit être présent parmi la liste des styles de paragraphe de votre document template.

6 - Création d'une portion de texte

Une portion de texte permet de mettre en valeur un mot d'une phrase par exemple. Pour en créer, il suffit d'ajouter un élément XSL portant le nom text:span. Dans cet exemple, le style Underline est appliqué au contenu de la balise underline.


<xsl:template match="underline">
   <xsl:element name="text:span">
      <xsl:attribute name="text:style-name">Underline</xsl:attribute>
      <xsl:apply-templates/>
   </xsl:element>
</xsl:template>

Le style Underline doit être présent parmi la liste des styles de caractère de votre document template.

7 - Validation du fichier

Il est conseillé de valider des fichiers XSL grâce à un processeur XSL afin l'import d'un fichier sous OOo. En effet en cas de problème sur le fichier, OpenOffice affiche un message d'erreur ne comportant aucune information quant à l'origine de l'erreur :

8 - Import du fichier

Une fois les filtres configurés pour l'import, il faut ouvrir le fichier XML avec OOo.


[Haut de page]