Les deux transformations qui seront sans doute le plus utilisés avec DocBook vont être abordées ici: on va regarder comment générer un document PDF et des pages HTML à partir d'un fichier DocBook. Il va falloir tout d'abord télécharger des fichiers de transformation XSLT et quelques outils.
De bons fichiers XSL pour DocBook sont disponibles sur le site http://sourceforge.net/project/showfiles.php?group_id=21935. Il faut prendre le fichier docbook-xsl, et la documentation est incluse dans l'archive téléchargée. J'utilise la version 1.54.1, et je conseille de prendre au moins celle-là, étant donné que certaines versions antérieures ont quelques problèmes avec PassiveTeX.
Ensuite il faut un processeur XSLT. Un des processeurs conseillés par les auteurs des fichiers XSL, et qui fonctionne à la fois sous Windows et Unix, est xsltproc. Il fonctionne bien, est rapide et supporte quelques extensions exslt qui peuvent être utiles (exslt:document notamment). On peut le télécharger pour Windows ici: http://www.fh-frankfurt.de/~igor/projects/libxml/index.html. Il faut télécharger libxml, libxslt et xsltproc. Dézippez les trois archives dans le même dossier, et mettez le chemin de ce dossier dans le PATH pour que Windows puisse retrouver l'exécutable et les bibliothèques nécessaires pour faire une transformation xsl. Pour vérifier que tout fonctionne bien, ouvrez une fenêtre DOS, dans un répertoire autre que celui dans lequel est installé xsltproc, et tapez xsltproc. Il ne devrait pas y avoir d'erreur, et xsltproc devrait donner la liste des options disponibles.
Pour éviter que xsltproc charge systématiquement la dtd sur internet, vous pouvez utiliser un fichier catalogue, qui contient la liste des identifieurs PUBLIC que vous utilisez dans les documents xml et un fichier dtd stocké en local sur votre machine. Vous pouvez par exemple vous inspirer du fichier catalogue de XXE (le fichier catalog.xml dans le répertoire config). Il faudra sans doute changer les chemins relatifs dans le catalogue, puisqu'ils doivent être relatifs au répertoire de travail de xsltproc, donc celui de vos documents docbook. Une fois le fichier de catalogue créé, il faut créer une variable d'environnement (panneau de configuration, système, environnement) qui s'appelle XML_CATALOG_FILES et qui contient le chemin vers le fichier de catalogue.
Les fichiers xsl sont rangés dans différents dossiers suivant leur utilisation. On va surtout s'intéresser aux dossiers html et fo. Dans le dossier html se trouvent les xsl qui vont générer des fichiers html. Les deux que l'on va utiliser sont html/docbook.xsl et html/chunk.xsl. docbook.xsl crée un grand fichier html qui contient tout le document DocBook en une fois, tant dis que chunk.xsl va créer plusieurs petits fichiers, un par chapitre en général. chunk.xsl nécessite l'utilisation d'un processeur XSLT qui reconnaît l'extension exslt:document, ce qui est le cas de xsltproc. Dans le dossier fo le fichier fo/docbook.xsl permet de générer un fichier au format xsl-fo, ce qui permettra de générer un fichier PDF.
Ces fichiers XSL sont largement personnalisables, et sont contrôlés par une série de paramètres. On peut préciser la valeur des paramètres que l'on veut redéfinir sur la ligne de commande du processeur xslt, mais à la longue c'est beaucoup plus simple de les préciser dans son propre fichier xsl, en utilisant la fonctionnalité xsl:import. En effet on appliquera au fichier docbook son propre fichier xsl, qui fera appel aux fichiers xsl cités précédemment. Dans notre fichier xsl, on peut donner la valeur qu'on veut aux différents paramètres. Voici par exemple un fichier xsl qui permet de produire un document xsl-fo avec les extensions pour PassiveTeX, les équations au format LateX, et une sortie avec indentation pour pouvoir lire soi-même le fichier fo:
<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <!-- importation de la transformation docbook en fo--> <xsl:import href="file://E:/docbook-xsl/fo/docbook.xsl"/> <!-- sortie indentée --> <xsl:output method="xml" indent="yes" encoding="iso-8859-1"/> <!-- extensions PassiveTeX --> <xsl:param name="tex.math.in.alt" select="'latex'"/> <xsl:param name="passivetex.extensions" select="1"/> </xsl:stylesheet>
J'ai utilisé un chemin absolu pour le fichier xsl importé, ce qui me permet d'utiliser ce fichier xsl n'importe où sur mon disque.
Avec les fichiers xsl il y a une documentation qui contient tous les paramètres avec une petite explication sur ce qu'ils font et quelle valeur ils ont par défaut.
Commencez par faire votre fichier xsl, comme ci-dessus, en important au choix le fichier html/docbook.xsl pour créer une grande page html, ou le fichier html/chunk.xsl pour créer plusieurs petites pages. Dans ce dernier cas, le paramètre chunk.section.depth permet de régler la profondeur de la découpe (le niveau d'imbrication au bout duquel on place le contenu dans un nouveau fichier) et le paramètre chunk.first.sections permet de dire si l'on veut que la première section soit sur la même page que le sommaire ou sur une page séparée. Voici par exemple le fichier xsl qui a servi à changer ce document en ensemble de pages html (vous aurez sans doute besoin de changer le chemin absolu vers le fichier xsl):
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:import href="../xsl/html/chunk.xsl"/>
<!-- caractéristiques des pages html générées -->
<xsl:param name="chunker.output.indent" select="'yes'"/>
<xsl:param name="chunker.output.doctype-public" select="'-//W3C//DTD HTML 4.01 Transitional//EN'"/>
<xsl:param name="html.stylesheet" select="'style.css'"/>
<!-- extensions passivetex -->
<xsl:param name="tex.math.in.alt" select="'latex'"/>
<xsl:param name="passivetex.extensions" select="1"/>
<!-- pas de svg en sortie -->
<xsl:param name="use.svg" select="0"/>
<!-- numérotation des sections -->
<xsl:param name="section.autolabel" select="1"/>
<!-- table des matières sur une page séparée -->
<xsl:param name="chunk.first.sections" select="1"/>
</xsl:stylesheet>
Ensuite utilisez xsltproc pour faire la transformation. Si vous créez plusieurs fichiers html (si vous passez par html/chunk.xsl, donc) vous n'avez pas besoin de rediriger la sortie. Une commande comme ceci, dans une fenêtre DOS dans le répertoire du fichier docbook fonctionnera:
xslrproc mon_fichier_transform.xsl mon_fichier_docbook.xml
Et une série de fichiers html sera générée. Si vous créez un seul fichier html (donc en passant par html/docbook.xsl), vous devez rediriger la sortie vers le fichier de destination:
xsltproc mon_fichier_transform.xsl mon_fichier_docbook.xml > ma_sortie.html
Pour transformer un fichier fo en fichier pdf, un des moyens existants est PassiveTeX. Pour cela il faut tout d'abord installer TeX, et je conseille sous Windows la distribution MikTeX, qu'on peut trouver ici: http://www.miktex.org/setup.html. En plus de l'installation de base, il faudra installer les packages xmltex et passivetex. Vérifiez ensuite la version de passivetex que vous avez, parce que chez moi les versions antérieures à la 32 de fotex.xmt avaient quelques problèmes. Pour connaître le numéro de version, allez voir le début du fichier C:\texmf\tex\xmltex\passivetex\fotex.xmt (en supposant que mixTeX soit installé dans C:\texmf). Vous devriez avoir quelque chose comme ça:
% $Id: docbook.xml,v 1.1.1.1 2003/06/19 12:53:31 daixiwen Exp $, $Date: 2003/06/19 12:53:31 $
Ce qui est important c'est le numéro après le #. S'il est inférieur à 32, il faudrait mettre passivetex à jour. Malheureusement MikTeX n'évolue pas aussi rapidement que PassiveTeX, donc il faudra peut-être faire la mise à jour manuellement. Téléchargez la dernière version de PassiveTeX sur ce site: http://www.tei-c.org.uk/Software/passivetex/, et décomprimez l'archive pour remplacer le contenu du répertoire passivetex (normalement C:\texmf\tex\xmltex\passivetex).
Tout d'abord il faut utiliser les fichiers xsl pour créer un fo à partir de votre document DocBook. Pour cela je conseille d'utiliser votre propre xsl, comme dans l'exemple en début de chapitre. Il est intéressent de mettre le paramètre passivetex.extensions à 1, pour avoir les signets et les liens hypertexte dans le pdf produit. Ensuite, appliquez la transformation avec xsltproc:
xsltproc mon_fichier_transform.xsl mon_fichier_docbook.xml > ma_sortie.fo
Ensuite utilisez TeX pour produire le PDF:
pdfxmltex ma_sortie.fo
Il faudra exécuter deux fois cette commande pour que le PDF soit complet, avec les signets et les liens hypertexte correctement placés. Le résultat sera placé dans un fichier PDF qui a le même nom que le fichier fo d'origine (donc ici ma_sortie.pdf).