Les filtres XML sous OpenOffice (OOo)
Fichier XSL d'export
1 - Préambule
Ce fichier permet au filtre d'enregistrer un document OOo en fichier XML. Il va donc faire une correspondance entre les styles utilisés dans ce document et la balise à créer. 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 l'ensemble des espaces de nommage d'OpenOffice. Dans cet exemple, ils ne sont pas utiles, mais il permet d'en avoir la liste complète :
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:style="http://openoffice.org/2000/style"
xmlns:text="http://openoffice.org/2000/text"
xmlns:office="http://openoffice.org/2000/office"
xmlns:table="http://openoffice.org/2000/table"
xmlns:draw="http://openoffice.org/2000/drawing"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:meta="http://openoffice.org/2000/meta"
xmlns:number="http://openoffice.org/2000/datastyle"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:chart="http://openoffice.org/2000/chart"
xmlns:dr3d="http://openoffice.org/2000/dr3d"
xmlns:math="http://www.w3.org/1998/Math/MathML"
xmlns:form="http://openoffice.org/2000/form"
xmlns:script="http://openoffice.org/2000/script"
xmlns:config="http://openoffice.org/2001/config"
office:class="text"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
exclude-result-prefixes="office meta table number dc fo xlink
chart math script xsl draw svg dr3d form config text style">
<xsl:template match="/office:document">
<!-- **** DEBUT DU DOCUMENT **** -->
<xsl:text disable-output-escaping="yes">
<!DOCTYPE modules SYSTEM "BlocEnseignement.dtd">
</xsl:text>
<modules>
<xsl:apply-templates/>
</modules>
</xsl:template>
...
</xsl:stylesheet>
Dans cet exemple, la racine de mon document est nommée modules. Mon fichier XML résultat utilise le DTD BlocEnseignement.dtd situé sur le même système de fichier. Le début du contenu (le texte en lui même) d'un OOo se fait à partir de la balise /office:document.
3 - Les commentaires
Voici une liste non exhaustive des commentaires intéressants à gérer lors de l'export :
- dc:date : récupère la date de création du document ;
- dc:title : récupère le titre du document ;
- dc:description : récupère la description du document ;
- dc:subject : récupère le sujet du document ;
- dc:creator : récupère le créateur du document ;
- dc:keywords : récupère les mots clés du document.
Bien sûr, il est nécessaire de saisir l'ensemble de ces informations sous OOo en éditant les propriétés
du document afin de les récupérer lors de l'export.
Voici par exemple comment récupéré le contenu du champ Sujet des propriétés d'un document mais ne pas traiter celui du champ description :
<xsl:template match="office:meta">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="dc:description"> </xsl:template>
<xsl:template match="dc:subject">
<sujet>
<xsl:apply-templates/>
</sujet>
</xsl:template>
Pour ne pas traiter un commentaire, il est nécessaire de créer un template et de ne faire aucun traitement dedans. Si vous ne créez pas de template, le contenu du champ correspondant sera automatiquement exporté. S'il est vide, une ligne vide sera créée. Vous trouverez la liste des commentaires dans la spécification du format XML sous OOo à la page suivante http://xml.openoffice.org/ dans la section des informations générales. Lors de l'export, il reste cependant quelques lignes vides, je n'ai pas pu identifier leur provenance.
4 - Identification des sections
Si votre document comporte des sections, voici un exemple de code pour les gérer :
<xsl:template match="text:section">
<xsl:choose>
<xsl:when test="starts-with(@text:name, 'Promotion')">
<promotion>
<xsl:apply-templates/>
</promotion>
</xsl:when>
...
</xsl:choose>
</xsl:template>
Dans ce cas, chaque section dont le nom commence par Promotion sera transformée en balise XML promotion. Chaque paragraphe contenu dans celle-ci sera recopié à l'intérieur de cette balise.
Lors de l'importation du document XML sous OOo, j'avais numéroté les sections, c'est pour cela que j'utilise une fonction XSL afin de comparer seulement la première partie du nom. Une section est identifiée par une balise de type text:section.
5 - Identification des paragraphes
Si vous avez attribué des styles de paragraphe dans votre document, voici un exemple de code pour les gérer :
<xsl:template match="text:p">
<xsl:choose>
<xsl:when test="@text:style-name='LibelleBloc'">
<libelle>
<xsl:apply-templates/>
</libelle>
</xsl:when>
...
</xsl:choose>
</xsl:template>
Dans ce cas, chaque style de paragraphe nommé LibelleBloc sera transformé en balise XML libelle. Chaque phrase ayant ce style sera recopiée à l'intérieur de cette balise.
Un style de paragraphe est identifié par une balise de type text:p. Afin de récupérer son nom, il est nécessaire d'obtenir son attribut text:style-name. Le nom de style pour la comparaison doit être entre guillemet (d'où le code HTML '). Il doit également être strictement identique au nom du style défini dans le document.
6 - Identification des portions de texte
Si vous avez attribué des styles de caractère dans votre document, voici un exemple de code pour les gérer :
<xsl:template match="text:span">
<xsl:choose>
<xsl:when test="@text:style-name='NomEnseignant'">
<nom>
<xsl:apply-templates/>
</nom>
</xsl:when>
...
</xsl:choose>
</xsl:template>
Dans ce cas, chaque style de caractère nommé NomEnseignant sera transformé en balise XML nom. Chaque mot ayant ce style sera recopié à l'intérieur de cette balise.
Un style de caractère est identifié par une balise de type text:span. Afin de récupérer son nom, il est nécessaire d'obtenir son attribut text:style-name. Le nom de style pour la comparaison doit être entre guillemet (d'où le code HTML '). Il doit également être strictement identique au nom du style défini dans le document.
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 - Export du fichier
Une fois les modifications apportées au fichier, il faut l'enregistrer au format XML. Pour cela il faut choisir le menu Enregistrer sous... puis rechercher le nom du filtre que vous avez créé dans la liste déroulante des types de fichier.