Cours

Accédez à nos cours concernant des domaines et thématiques différentes. Vous pouvez aussi contribuer en rédigeant des articles.

Consulter les cours

Écoles

Parcourez notre annuaire d’écoles, instituts et universités du monde. Si votre école n’est pas listée, vous pouvez l’ajouter très facilement.

Consulter les écoles

Tchat

Accédez à notre messagerie instantanée pour échanger avec d’autres membres inscrits et aussi les invités. Aucune inscription n’est obligatoire.

Accéder au tchat

“Le présent article n'a pas encore été revu par un modérateur, pour cela veuillez faire attention quant à son contenu, que nous ne pouvons pas vous garantir son exactitude.”

I - Introduction

A) But recherché

Obtenir un document au format XHTML 1 strict valide à partir d'un document écrit dans OOo (http://www.openoffice.org/ writerversion 1.1.x) en passant par XSLT.

Pourquoi OOo? Tout simplement parce que c'est un logiciel de traitement de texte évolué, libre, gratuit et pluri plates-formes, donc que tout le monde peut posséder sans contraintes majeures. De plus, il permet à un béotien quelque peu rebuté par l'utilisation d'une interface web, au sens large du terme, pour écrire des articles et qui ne veut/peut pas s'investir dans l'apprentissage de la syntaxe wiki par exemple, de pouvoir rédiger des articles simplement, dans un environnement logiciel connu dont la règle minimale est simplement de savoir utiliser un peu les Styles de paragraphe sous OOo (touche F11 par défaut) et de savoir créer un lien hypertexte. Aucun réglage de quelque sorte que ce soit n'est donc requis.

Le choix de XHTML en sortie est sans doute discutable, mais si votre site est codé en respectant les normes du XHTML 1 strict, ce choix se justifie. L'obtention de HTML en sortie se fait simplement en changeant l'entête du document XSL.

B) Remarques - Limitations

Aucune CSS n'est associée à la transformation : je pars du principe d'un développement full-CSS, c'est à dire que dans le présent cas l'article transformé serait contenu dans des balises <div id="article"> et </div> par exemple (je parle uniquement du contenu compris entre les balises <body> et </body>).

Néanmoins, tous les éléments HTML sont mis en place par l'utilisation de <xsl:element> afin de permettre le rajout éventuel d'attributs de style, pour ceux qui le souhaitent, via l'utilisation de <xsl:attribute>.

Pour les besoins de la démonstration, le document que produit la transformation est complet, en ce sens qu'il possède tous les entêtes et est valide XHTML 1 strict (testé sur le validator du W3C). En effet, dans le cas de l'intégration à un site, il suffit juste de remplir la partie contenue en sortie dans le <body> du document.

De même, tout ce qui concerne la mise en place de formulaire de soumission et transfert FTP du fichier SXW ainsi que la gestion du cache sort de mon propos et n'a donc pas été abordé ici. La décompression du fichier SXW n'est que brièvement abordée.

Il n'est pas question d'expliquer le XML ou XSLT dans cet exposé et vous devez posséder un minimum de connaissances concernant le HTML.

Le script PHP permettant la transformation du fichier XML est prévu pour fonctionner sous PHP5.

C) Présentation du document SXW

Pour des raisons de respect de la syntaxe XHTML, le style gras de OOo correspond en sortie à <strong> et italique à <em>, souligné n'ayant pas d'équivalent.

Ce fichier XSL transforme les titres, le texte, les liens hypertextes (avec quelques astuces pour combler des lacunes de OOo), les images (sous conditions, cf. plus loin), les listes numérotées ou non (les tableaux et d'autres éléments seront abordés dans un prochain article).

II - Le format SXW : du XML compressé

A) De SXW à XML

Un document issu de OpenOffice-Writer est au format SXW. Ce format correspond à une archive au format ZIP qui peut donc être décompressée facilement. En voici trois méthodes :

  1. dans un terminal, sous Linux, en faisant simplement unzip mon_fichier.SXW,
  2. en utilisant PHP, dans ce cas j'ai choisi d'utiliser PclZip 2.3 qui n'est autre qu'une librairie écrite en PHP permettant l'extraction (entre autre) de fichiers au format ZIP. La syntaxe est la suivante :

      $archive = new PclZip("mon_fichier.sxw");
      $archive->extract(PCLZIP_OPT_PATH,"./destination");   

  1. sous Windows XP un utilitaire est fourni par défaut. Vous pouvez également en trouver sur Internet de bonnes qualité tel que 7-Zip 4.20 sous licence LGPL

Dans tous les cas, vous obtenez un ensemble de fichiers (plus de détails dans cette page) dans lesquels seul content.xml et le répertoire Pictures/ contenant les images nous intéressent.

B) Structure de content.xml

L'architecture globale du fichier est la suivante :

// fichier content.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE office:document-content PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "office.dtd">
<office:document-content xmlns:office="http://openoffice.org/2000/office"...>
<office:script/>
<office:font-decls/>
<office:automatic-styles/>
<office:body/>
</office:document-content>    

III - Construction de la feuille de style

A) Structure générale du fichier XSLT

Totalement classique donc dispensée de commentaire.

// fichier OOo.xls
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"... >
<xsl:output.../>
<xsl:template...>...</xsl:template>
</xsl:stylesheet>

B) Un préalable les entêtes

<xsl:stylesheet version="1.0"
  xmlns:xsl=http://www.w3.org/1999/XSL/Transform
  xmlns:office=http://openoffice.org/2000/office
  xmlns:style="http://openoffice.org/2000/style"
  xmlns:text=http://openoffice.org/2000/text
  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:svg=http://www.w3.org/2000/svg
  xmlns:xhtml="http://www.w3.org/1999/xhtml"
  exclude-result-prefixes="office style text table draw fo xlink svg xhtml">

La ligne xmlns:xsl="http://www.w3.org/1999/XSL/Transform" (xmlns pour espace de nom XSLT) est classique dès lors que l'on souhaite effectuer une transformation de fichier.

Les autres espaces de noms sont issus de OOo et sont présents dans le fichier content.xml (en tant qu'attribut du nœud office:document-content). Il y en a d'autres, mais ils nous seront d'aucune utilité ici (références du format XML utilisé par OOo pages 26 et 27 de ce document):

Je n'ai donc choisi de garder que les éléments les plus courants, en éliminant tout ce qui concernait les formulaires et données que OOo peut également traiter.

Enfin, afin d'éviter des problèmes de validation en sortie, on élimine tous les préfixes gênants, c'est le rôle de exclude-result-prefixes.

C) L'indication de ce qui est voulu en sortie

Aucune surprise pour cette partie, ici je déclare simplement que le document désiré en sortie (élément xsl:output) devra utiliser la méthode XML (attribut method="xml"), le charset ISO-8859-1 (attribut encoding) sans déclaration XML (attribut omit-xml-declaration) en début de document et que son DOCTYPE (attributs doctype-public et doctype-system) correspondra à celui du XHTML 1.0 strict. Le processeur XSLT devant générer une déclaration de document autonome (attribut standalone) en indentant le code (attribut indent). Pour plus de détails sur l'élément xsl:output, consultez cette page.

Le code à inscrire dans le fichier XSL est donc le suivant :

// fichier OOo.xls
<xsl:output
  method="xml"
  version="1.0"
  encoding="iso-8859-1"
  doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
  doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
  standalone="yes"
  indent="yes" />

Le choix de la méthode XML est à relier au fait que nous désirons obtenir un document XHTML bien formé en sortie. Le reste étant classique.

D) Mise en place de la structure du fichier HTML

Un fichier HTML correctement construit doit disposer de la structure minimale suivante :

<DOCTYPE>
<html>
<head>
<title></title>
</head>
<body></body>
</html>

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 pattern office:body dans la mesure où ce nœud contient tout le contenu textuel de l'article. De plus, ceci permet d'éviter d'afficher le contenu textuel présent dans les autres éléments de plus haut niveau du fichier content.xml ce qui aurait pu être le cas en utilisant le pattern / c'est à dire la racine du document XML.

// fichier OOo.xls
<xsl:template match="office:body">
<html lang="fr" xml:lang="fr">
<head>
<title>Mon Site - <xsl:value-of select="text:p[@text:style-name='Heading']" /></title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>

Je n'ai pas fait mention du DOCTYPE ici dans la mesure où cette information est renseignée dans xsl:output qui va se charger l'indiquer.

Le choix de la langue française (attribut lang), tout comme le choix du charset sont faits pour répondre à mes besoins propres.

L'oubli d'indication des métadonnées (balise HTML <meta>) est volontaire sera abordé dans un prochain article.

Comme vous pouvez le constater dans le code précédent, je n'ai pas défini d'appel à une feuille de style CSS afin de simplifier les choses. Dans la pratique, dans l'hypothèse d'une intégration de l'article dans un système de pseudo-frames par exemple, cette ossature serait simplifiée de la façon suivante :

// fichier OOo.xls
<xsl:template match="/">
  <div id="article">
    <xsl:apply-templates/>
  </div>
</xsl:template>

C'est à dire que seul le contenu de la balise <body> serait conservé, le rajout d'une CSS externe permettant de gérer directement tous les styles sans avoir à modifier quoi que ce soit.

E) La mise en forme

A partir de maintenant, nous allons traiter l'ensemble des informations contenues dans le nœud <office:body> du fichier content.xml.

) Mise en forme du titre

Je suppose que le rédacteur de l'article a bien utilisé le format "Titre" dans OOo pour définir le titre de son article, les titres 1, 2... Étant réservés aux sous-titres de l'article. De plus, je suis parti du principe que la balise <h1> était réservée soit pour le titre du site, soit pour celui de la section ou la combinaison des deux, le titre de l'article doit donc se retrouver en position 2 (balise <h2>). Or dans content.xml. le style Titre est considéré comme du texte :

// fichier content.xml
<text:p text:style-name="Heading">Mon premier article (niv. Titre)</text:p>

Il nous faut donc rechercher un nœud de type text:p (non vide ce qui explique l'utilisation de présence de node()) dont l'attribut text:style-name a pour valeur Heading et encadrer le nœud texte correspondant par la balise appropriée <h2>. Ce qui nous donne le code suivant :

// fichier OOo.xls
<xsl:template match="text:p">
  <xsl:choose>
  [...]
  <xsl:when test="@text:style-name='Heading' and node()">
    <h2>
      <xsl:apply-templates/>
    </h2>
  </xsl:when>
  [...]
  </xsl:choose>
</xsl:template>

On peut y ajouter très facilement des attributs de styles CSS par l'utilisation de l'élément xsl:attribute comme dans l'exemple suivant :

// fichier OOo.xls
<xsl:element name="h2">
  <xsl:attribute name="class">
    <xsl:text>monStyle</xsl:text>
  </xsl:attribute>
  <xsl:apply-templates/>
</h2>

Notez bien que dans l'exemple précédent j'ai inscrit en dur le nom de la classe de style CSS, mais j'aurais très bien pu passer par l'utilisation d'un paramètre afin de dynamiser cette portion :

// fichier OOo.xls
<xsl:param name="monStyle" />
<xsl:element name="h3">
  <xsl:attribute name="class">
    <xsl:value-of select="$monStyle" />
  </xsl:attribute>
  <xsl:apply-templates/>
</xsl:element>

Le paramètre $monStyle est créée grâce à l'utilisation de l'élément xsl:param. Comme vous le voyez, aucune valeur n'est affectée à cette variable dans la XSL dans le cas présent (mais c'est bien sur possible), car ici on le fait en passant par PHP5 en utilisant la méthode XSLTProcessor::setParameter (Documentation officielle en français pour XSLTProcessor::setParameter).

2°) Mise en forme des sous-titres.

Les sous-titres ne peuvent donc prendre, comme niveau de titre maximum, que <h3> et comme niveau de titre le plus bas <h6>. L'excédent est donc transformé en paragraphe texte simple pour lequel je n'ai pas choisi d'y attribuer une quelconque emphase, mais ceci peut se modifier facilement. Dans OOo, les styles Titre1 à Titre 10 ne sont pas des noeuds textes équivalent au style Titre, ce qui en facilite leur recherche :

// fichier content.xml
<text:h text:style-name="Heading 1" text:level="1">
  Mon premier titre d'article
</text:h>

Il nous faut donc rechercher tous les nœuds text:h (non vide) et leur attribuer le bon numéro de balise. Or dans OOo le style Titre 1 a comme paramètre récupérable facilement text:level auquel il faudra simplement appliquer le décalage approprié qui est de 2 dans notre cas (Rappel : <h1> pour le titre du site par exemple, <h2> pour le titre de l'article, le premier niveau de sous-titre est donc <h3>). Il faut donc passer par l'utilisation d'une variable qui prendra comme valeur le niveau de titre souhaité en sortie, tester si ce paramètre a une valeur qui reste inférieure ou égale à 6 (en HTML <h6> est le niveau minimum en terme de sous-titre) et construire la balise h appropriée. Je vous laisse découvrir le code :

// fichier OOo.xls
<xsl:template match="text:h">
  <xsl:variable name="level" select="@text:level+2" />
  <xsl:choose>
    <xsl:when test="$level <= 6">
      <xsl:element name="h{$level}">
        <xsl:apply-templates/>
      </xsl:element>
    </xsl:when>
    <xsl:otherwise>
      <p>
        <xsl:apply-templates/>
      </p>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

3°) Mise en place des blocs de citations

Une citation est obtenue sous OOo en sélectionnant tout simplement Citation dans la liste des styles prédéfinis (affichable via la touche F11).

La première ligne doit être lue de la façon suivante : si le noeud s'appelle text:p et possède l'attribut text:style-name qui a pour valeur soit Quotations et n'est pas vide (d'où l'utilisation de node()) alors on met son contenu entre les balises <blockquote><p></p></blockquote>.

// fichier OOo.xls
<xsl:template match="text:p">
  <xsl:choose>
  [..]
  <xsl:when test="@text:style-name='Quotations' and node()">
    <blockquote>
      <p>
        <xsl:apply-templates/>
      </p>
    </blockquote>
  </xsl:when>
  [...]
  </xsl:choose>
</xsl:template>

4°) Mise en place des blocs de texte

La méthode est toujours la même si ce n'est qu'ici il faut lire le code de la façon suivante : si le nœud s'appelle text:p, s'il n'est pas vide, si ce n'est ni un titre de page, ni une citation..., et ce, quelle que soit la valeur de l'attribut text:style-name, alors le contenu doit être inscrit entre les balises <p></p>.

// fichier OOo.xls
<xsl:template match="text:p">
  <xsl:choose>
  [..]
  <xsl:otherwise>    
    <xsl:if test="node()">
      <p>
        <xsl:apply-templates/>
      </p>
    </xsl:if>
  </xsl:otherwise>
  [...]
  </xsl:choose>
</xsl:template>

5°) Formatage du texte contenu dans les paragraphes

Je sens que dans cette partie je risque de m'attirer les foudres de quelques pontes :) de la sémantique, mais bon, je n'ai pas trouvé mieux.

OOo en tant que logiciel de traitement de texte permet d'épaissir, d'incliner et/ou de souligner du texte. En XHTML ce n'est pas possible directement, sauf en passant par CSS. Je suis donc parti du principe que si un texte avait été indiqué en gras dans OOo, c'est qu'il devait être considéré comme important (correspondance avec la balise <strong>) et que s'il était incliné, c'est qu'il était de moindre importance (balise <em>). Le soulignement étant quant à lui ignoré. Je vous rappelle qu'il s'agit d'une part d'un premier jet et d'autres par du résultat de choix personnels. Tout ceci est bien sûr modifiable aisément via l'utilisation du tag HTML <span>.

Par voie de conséquence, un texte ne peut donc pas être et gras et incliné en sortie puisqu'il ne peut pas être à la fois d'une grande importance et d'une importance moins grande. La priorité est donc logiquement donnée à la balise <strong>, puis à la balise <em>.

Autre problème, dans le noeud <office:body> du fichier content.xml les indications de style se limitent à un noeud <text:span> (noeud fils du noeud <text:p>) ayant pour attribut text:style-name prenant les valeurs T suivi d'une chiffre dont le numéro indique simplement dans quel ordre il a été utilisé en premier. Vous pouvez donc très bien avoir, pour deux articles différents une même valeur T2 de l'attribut text:style-name qui désigne dans l'un un texte en gras et dans l'autre cas un texte souligné. Il faut donc aller chercher la signification de cette valeur d'attribut dans un autre noeud : <office:automatic-styles>.

Exemple de ce que l'on peut trouver dans le noeud <office:automatic-styles> pour du texte saisi en gras dans OOo :

// fichier content.xml
<style:style style:name="T1" style:family="text">
  <style:properties fo:font-weight="bold"
    style:font-weight-asian="bold"
    style:font-weight-complex="bold" />
</style:style>

Comme vous pouvez le constater ce qui nous intéresse ici est fo:font-weight="bold" et, dans le même ordre d'idée, on peut trouver fo:font-style="italic" et style:text-underline="single" (ce dernier n'étant pas pris en compte lors de la transformation).

Pour simplifier le traitement, on passe par l'utilisation de variables (déclarées via <xsl:variable>).

L'ordre des tests effectués (<xsl:when>) est ici important puisqu'il permet de respecter les priorités (schématiquement strong > em > reste).

// fichier OOo.xls
<xsl:template match=":span">
  <xsl:variable name="StyleType" select="@text:style-name" />
  <xsl:variable name="weight" select="/office:document-content/office:automatic-styles/style:style[@style:name=$StyleType]/style:properties/@fo:font-weight" />
  <xsl:variable name="style" select="/office:document-content/office:automatic-styles/style:style[@style:name=$StyleType]/style:properties/@fo:font-style" />

  <xsl:choose>
    <xsl:when test="$weight='bold'">
      <strong><xsl:apply-templates/></strong>
    </xsl:when>
    <xsl:when test="$style='italic'">
      <em><xsl:apply-templates/></em>
    </xsl:when>
    <xsl:otherwise>
      <xsl:apply-templates />
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

6°) Mise en forme des images

Concernant les images, les paramètres de réglages individuels peuvent influer sur le résultat. En ce qui me concerne, je ne suis pas certain d'avoir laissé certains réglages par défaut : à savoir pour les principaux l'échelle en 1:1 et l'unité de mesure en cm (centimètres). Sachant cela, on va pouvoir réaliser une transformation sans déformation de l'image. Il est bien évident que ce système possède un côté archaïque. De plus, je suppose que le fichier SXW a été décompressé dans le répertoire qui contient le fichier PHP et la feuille XSL (voilà qui mériterait l'utilisation d'un paramètre, pour une prochaine version :) ).

// fichier content.xml
<draw:image draw:style-name="fr1"
  draw:name="Image1"
  text:anchor-type="paragraph"
  svg:width="3.316cm"
  svg:height="0.529cm"
  draw:z-index="0"
  xlink:href="#Pictures/100000000000005E0000000FC38DE25E.png"
  xlink:type="simple"
  xlink:show="embed"
  xlink:actuate="onLoad" />

Ce qui nous intéresse est qu'une image est indiquée par un élément <draw:image/> et est caractérisée par une série d'attributs dont certains permettent de renseigner les attributs de l'élément <img /> :

Il est bien évident qu'un certain nombre de ces informations doivent être modifiées. Cela concerne le nom, le titre et l'adresse des images. Ceci est en fait une opération à effectuer après décompression et avant transformation. Une solution de nommage des fichiers d'un article serait, par exemple, de reprendre toute ou partie du titre de l'article et d'y attribuer un numéro aléatoire. Une autre solution serait que l'utilisateur renseigne correctement les informations dans OOo, clic droit sur l'image, menu Image, onglet Option

// fichier OOo.xls
<xsl:template match="//draw:image">
  <img>
    <xsl:attribute name="src">
      <xsl:value-of select="substring(@xlink:href,2)" />
    </xsl:attribute>
    <xsl:attribute name="width">
      <xsl:value-of select="round(substring-before(@svg:width,'cm')*38.37)" />
    </xsl:attribute>
    <xsl:attribute name="height">
      <xsl:value-of select="round(substring-before(@svg:height,'cm')*38.37)" />
    </xsl:attribute>
    <xsl:attribute name="alt">
      <xsl:value-of select="@draw:name" />
    </xsl:attribute>

    <xsl:if test="svg:desc">
      <xsl:attribute name="longdesc">
        <xsl:value-of select="svg:desc" />
      </xsl:attribute>
    </xsl:if>
  </img>
</xsl:template>

7°) Mise en forme des liens hypertextes

Pour créer un hyperlien (ou lien hypertexte) l'utilisateur doit simplement se rendre dans le menu Insertion/hyperlien et remplir les champs qu'il souhaite.

Pour effectuer la transformation, rien de bien difficile puisque la forme des liens hypertextes dans content.xml se rapproche assez de celle des liens HTML.

// fichier content.xml
<text:a xlink:type="simple"
xlink:href="http://www.biophyse.net/"
office:name="test lien simple">lien (fr)</text:a>

Cette fois-ci il nous faut donc trouver un noeud text:a. La syntaxe est suffisamment simple pour ne pas avoir besoin de l'expliquer. Mais OOo possède une lacune : il n'y a pas de correspondance avec l'attribut HTML hreflang. J'ai pallié à ce problème très simplement. Il suffit que l'utilisateur indique entre parenthèse la langue du lien cible. Bien sûr, on n'est pas à l'abri d'erreurs de saisies. Aussi, dans cette première version j'ai indiqué qu'il ne fallait récupérer que les 2 premiers caractères de la chaîne située entre parenthèse. Si moins de 2 caractères ont été saisis par l'utilisateur, l'attribut hreflang n'est pas créé.

Remarque : une solution plus élégante consiste à créer un fichier XML contenant tous les indicatifs de langue (ainsi que les noms de pays) et à effectuer une comparaison entre ce qui a été saisi par l'utilisateur et ce que contient un tel fichier, donc ce qui existe vraiment. Bien sûr il faudrait prévoir le cas où la reconnaissance ne se fait pas et donc l'attribut HTML hreflang ne peut pas être renseigné.

// fichier OOo.xls
<xsl:template match="text:a">
<a>
  <xsl:attribute name="href">
    <xsl:value-of select="@xlink:href" />
  </xsl:attribute>
  <xsl:attribute name="title">
    <xsl:value-of select="@office:name" />
  </xsl:attribute>
  <xsl:choose>
    <!--
    Récupère ce qu'il y a entre parenthèse,
    si la sous-chaîne a une longueur <=2 on crée l'attribut hreflang
    sinon on ne le crée pas
    -->
    <xsl:when test="contains(.,')') and string-length(substring-after(substring-before(.,')'),'('))<=2">
      <xsl:attribute name="hreflang">
            <xsl:value-of select="substring-after(substring-before(.,')'),'(')" />
      </xsl:attribute>
      <xsl:value-of select="substring-before(.,'(')" />
    </xsl:when>
    <xsl:otherwise>
      <xsl:apply-templates/>
    </xsl:otherwise>
  </xsl:choose>
  <!--
  l'attribut target n'est pas traité ici,
  les liens s'ouvrent par défaut dans la fenêtre active
  -->
</a>
</xsl:template>

8°) Les listes

Là encore, la syntaxe utilisée dans le fichier content.xml est simple et donc facilement compréhensible :

// fichier content.xml
<text:unordered-list text:style-name="L1">
  <text:list-item>
    <text:p text:style-name="P1">item lev 1</text:p>
  </text:list-item>
</text:unordered-list>
</text:unordered-list>

Comme vous pouvez le voir, la syntaxe est la même que pour le HTML, seul le nom des tags changent. Le fichier XML permet de plus d'effectuer une distinction rapide entre les listes ordonnées et non ordonnées grâce au nom du nœud qui est soit <text:unordered-list> soit <text:ordered-list>. Ensuite, la présence d'un ou plusieurs nœuds fils <text:list-item> communs aux deux types de listes (comme en HTML toujours) permet de traiter le cas des listes imbriquées très simplement.

// fichier Ooo.xls
// Listes ordonnées
<xsl:template match="text:ordered-list">
  <ol>
    <xsl:apply-templates/>
  </ol>
</xsl:template>

// Listes non ordonnées
<xsl:template match="text:unordered-list">
  <ul>
    <xsl:apply-templates/>
  </ul>
</xsl:template>

// Traitement des items de liste
<xsl:template match="text:list-item">
  <li>
    <xsl:apply-templates />
  </li>
</xsl:template>

Cependant il reste un détail à corriger puisque, comme vous pouvez le voir dans l'extrait précédent du fichier content.xml, la déclaration d'item de liste est suivie immédiatement par la déclaration d'un paragraphe, ce qui, en l'état aboutirait au résultat suivant en HTML:

// Extrait d'une sortie HTML
<li><p>Le texte présent dans l'item</p></li>

Ce qui est plutôt disgracieux. Il faut donc encore une fois rajouter un évènement à template match="p" pour que les listes aient un aspect normal.

// fichier OOo.xls
<xsl:template match="text:p">
  [..]
  <xsl:when test="name(..)='text:list-item'">
    <xsl:apply-templates/>
  </xsl:when>
  [...]
</xsl:template>

En clair on vérifie que l'ancêtre du nœud courant a pour nom text:list-item. Si c'est le cas, alors on applique les différents templates à l'exception de l'insertion des balises <p></p>.

IV - La partie PHP

Je ne verrais le cas que du code à mettre dans le cas de l'utilisation de PHP5. Celui-ci nous est directement fourni par la documentation officielle de PHP.net. Il suffit de visiter la page relative à XSLTProcessor->transformToXML().

// Transformation.php
<?php
// Chargement du source Xml
$xml = new DOMDocument;
$xml->load('content.xml');

$xsl = new DOMDocument;
$xsl->load('OOo.xsl');

// Configuration du transformateur
$proc = new XSLTProcessor;

// Attachement des règles xsl
$proc->importStyleSheet($xsl);

echo $proc->transformToXML($xml);
?>

V - Evolution envisageable

Compléter les possibilités de la présente XSL en :

Automatiser l'ensemble avec toutes les fonctionnalités suivantes :

VI - Bibliographie – sources d'inspiration – sur le net

A) Les normes

B) Les ressources nécessaires

OpenOffice.org XML File Format dont la section File Format Specification and General Information contient tout ce qui est nécessaire pour comprendre le XML produit par OOo.

Approfondissez votre lecture :

Informations sur l'auteur

codeur
  • Pseudo : codeur
  • Date de naissance : 1985-10-03
  • Age : 40 ans
  • Pays : Maroc
  • école

Informations sur le cours

  • Nombre de fois vus : 1980
  • Langue de rédaction : Français
  • Date de création : le 03/05/2017 à 22:59:35
  • Date de mise à jour : le 04/05/2017 à 22:57:52

Aidez la Communauté des Étudiants !