<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<!DOCTYPE article SYSTEM "article.dtd" []>

<article titre="Génération de documents avec XML">
  <tete>
    <version>0.1</version>
    <date>25 août 2000</date>
    <auteur>Éric Jacoboni</auteur>
   </tete>

  <toc></toc>

  <resume>
  Cet article présente les différents étapes de création d'un document
  XML et de la génération de documents en différents formats à partir
  de lui.
  </resume>

<corps>
<section titre="Termes d'utilisation">

<para>La redistribution du code source (<url nom="XML"
  lien="Intro-XML.xml"/>), modifié ou non, et compilé (HTML,
  PostScript, etc.) est soumise aux conditions suivantes&nbsp;:</para>

<para>
  <liste type="enum">
    <item> Le copyright ci-dessus, la présente liste de conditions et
        l'avertissement qui la suit doivent figurer dans le code
        source.</item>

    <item>Le code source distribué sous forme compilée doit 
        faire apparaître le copyright ci-dessus, la présente
        liste de conditions et l'avertissement qui la suit.</item>
  </liste>
</para>

<para>CE DOCUMENT EST FOURNI « TEL QUEL » ET IL N'EST DONNÉ
  AUCUNE GARANTIE, IMPLICITE OU EXPLICITE, QUANT À SON UTILISATION
  COMMERCIALE, PROFESSIONNELLE OU AUTRE. L'AUTEUR NE PEUT EN AUCUN CAS ÊTRE
  TENU POUR RESPONSABLE DE QUELQUE DOMMAGE OU PRÉJUDICE DIRECT,
  INDIRECT, SECONDAIRE OU ACCESSOIRE (Y COMPRIS LES PERTES FINANCIÈRES
  DUES AU MANQUE À GAGNER, À L'INTERRUPTION D'ACTIVITÉS,
  OU LA PERTE D'INFORMATIONS ET AUTRES) DÉCOULANT DE L'UTILISATION DE
  LA DOCUMENTATION OU DE L'IMPOSSIBILITÉ D'UTILISER CELLE-CI, ET DONT
  L'UTILISATEUR ACCEPTE L'ENTIÈRE RESPONSABILITÉ.</para>
</section>

<section titre="Introduction">

<para>Pour produire des documents comme celui-ci, j'utilisais jusqu'alors
soit LaTeX soit SGML avec les DTDs <tt>linuxdoc</tt> ou
<tt>DocBook</tt>.</para>

<para><liste>
<item>Le problème de LaTeX est qu'il est bien adapté à la production
    de documents imprimables de qualité, mais peu à celle de documents
    en ligne (même si <tt>latex2html</tt> permet de s'en sortir à peu
    près).</item>

<item>Le problème de <tt>linuxdoc</tt> est qu'il est vite limité et
    figé, celui de <tt>DocBook</tt> est qu'il n'est pas adapté aux
    petits documents, mais destiné à des ouvrages volumineux.</item>
</liste></para>

<para>L'avantage de XML est qu'il permet de définir les balises dont
on a besoin : on n'est plus obligé de connaître les balises du «
langage », comme c'est le cas avec HTML et DocBook par exemple. Reste
évidemment à expliquer ensuite ce qu'il convient de faire de ces
balises.</para>

<para>Bien que je ne sois pas un expert en la matière, j'ai jugé utile
d'expliquer en quoi XML pouvait faciliter la vie de ceux qui, comme
moi, écrivent des documents amenés à être publiés sur le Web, ou
sous forme d'articles imprimés ou de transparents. Cet article n'est
donc pas un cours sur XML : vous trouverez dans la section
<em>Références</em> des liens vous permettant d'en connaître les
moindres détails. Par contre, parmi cette foison de présentations,
assez académiques, il faut le dire, j'ai eu du mal à trouver les
informations <em>pratiques</em> permettant de résoudre mon problème
: cet article est donc une synthèse de ma compréhension actuelle.</para>

<para>Le problème que je m'étais fixé était le suivant : écrire un
document quelconque en XML en utilisant les balises adéquates pour
celui-ci, et créer le programme de transformation de ce document en
un format utilisable par tous : HTML, PS ou PDF. La transformation en
ces deux derniers formats nécessite une transformation préalable en
<tt>dvi</tt> car je ne sais pas produire directement du
PostScript&nbsp;!</para>

<para>Pour ce faire, il existe une pléthore d'outils, la plupart
nécessitent Java ce qui m'a fait les écarter car je n'aime pas Java
et la nécessité de l'installer pour passer de XML à, par exemple,
HTML me semble excessif. Encore une fois, je veux que le document et
les outils permettant de le transformer puissent être reconnus sur un
maximum de machines sans nécessiter l'installation de logiciels
exigeants en ressources.</para>

<para>À part Java, il existe également des modules Perl, qui ont l'avantage
d'être moins imposants en termes d'espace disque. Perl étant installé
sur tout système sérieux, le problème de la transformation se borne à
l'installation d'un unique module, <tt>XML::Parser</tt>. Pour vérifier
la syntaxe et la cohérence du document XML par rapport aux DTD, on
peut utiliser le module <tt>XML::Checker</tt> ou le petit programme
<tt>rxp</tt>. Nous ne détaillerons pas ici l'installation de ces
logiciels car elle ne présente pas de difficultés particulières&nbsp;:
nous supposerons seulement qu'ils sont installés.</para>
</section>

<section titre="Création d'un document XML">

<subsection titre="Structure d'un document type">

<para>Avant de commencer à écrire notre texte, commençons par penser à sa
structure. Pour nous un article comporte&nbsp;:

<liste>
	  <item>un <em>titre</em> ;</item> 

	  <item>un <em>entête</em> comportant le numéro de version
	  éventuel, la date de dernière modification, et le nom de
	  l'auteur du document ;</item>

          <item>un <em>résumé</em> éventuel, présentant
	  rapidement le but du document ;</item> 

           <item><em>un corps</em> découpé en sections, pouvant
	  elles-mêmes comporter des sous-sections. Chacune
	  d'elles contient le texte.</item>
</liste></para>

<para>Ce texte peut être enrichi par des mises en forme
particulières&nbsp;:

<liste type='simple'>
	  <item><em>listes</em> pour énumérer des éléments. Ces listes
	  peuvent être simples (comme ici) ou numérotées :
              <liste type='enum'>
                  <item>comme ici ;</item>
                  <item>ou comme là.</item>
              </liste>
          </item>

	  <item><em>italiques</em> (ou tout autre modification de
	    police) pour mettre en évidence du texte (comme
	    <em>ici</em>) ;</item>

	  <item><em>police fixe</em> pour noter du texte littéral, des
	  noms de fichiers ou de commandes (comme <tt>ici</tt>)
	    ;</item>

          <item><em>gestion</em> des URL pour générer, des liens
          hypertextes dans les situations où cela a du sens.</item>
</liste></para>

<para>Il s'agit donc d'une structure relativement simple, mais couvrant la
majeure partie des documents classiques. Par ailleurs, cette DTD
évolue tout en sachant qu'il n'est pas question de multiplier les
balises : "<em>small is beautiful</em>"...</para>
</subsection>

<subsection titre="Écriture d'une DTD pour définir la structure">

<para>Cette structure ayant été mise au point, nous pouvons
l'implémenter sous la forme d'une DTD&nbsp;:
<tt>article.dtd</tt></para>

<verbatim>
&lt;!ENTITY % titre.com  "titre CDATA #REQUIRED"&gt;

&lt;!ENTITY % url.com    "nom CDATA #REQUIRED
                          lien CDATA #REQUIRED"&gt;

&lt;!ENTITY % label.com  "id CDATA #REQUIRED"&gt;

&lt;!ENTITY % type.com    "type CDATA #IMPLIED"&gt;

&lt;!ELEMENT article (tete?,resume?,toc?,corps)&gt;
&lt;!ATTLIST article %titre.com;&gt;

&lt;!ELEMENT tete (version?,date,auteur)&gt;
&lt;!ELEMENT corps (section)+&gt;

&lt;!ELEMENT date  (#PCDATA)&gt;
&lt;!ELEMENT version  (#PCDATA)&gt;
&lt;!ELEMENT auteur  (#PCDATA)&gt;

&lt;!ELEMENT resume (#PCDATA)&gt;

&lt;!ELEMENT toc EMPTY&gt;

&lt;!ELEMENT para (#PCDATA)&gt;

&lt;!ELEMENT section (para|subsection)+ &gt;
&lt;!ATTLIST section %titre.com;&gt;

&lt;!ELEMENT subsection (#PCDATA)&gt;
&lt;!ATTLIST subsection %titre.com;&gt;

&lt;!ELEMENT em (#PCDATA)&gt;
&lt;!ELEMENT tt (#PCDATA)&gt;

&lt;!ELEMENT url (#PCDATA)&gt;
&lt;!ATTLIST url %url.com;&gt;

&lt;!ELEMENT liste (item)+ &gt;
&lt;!ATTLIST liste %type.com;&gt;

&lt;!ELEMENT item (#PCDATA)&gt;

&lt;!ELEMENT verbatim (#PCDATA)&gt;

&lt;!ELEMENT label (#PCDATA)&gt;
&lt;!ATTLIST label %label.com;&gt;

&lt;!ELEMENT ref (#PCDATA)&gt;
&lt;!ATTLIST ref %label.com;&gt;
</verbatim>

<para><em>Attention</em>&nbsp;: cette DTD fera probablement se gausser les
spécialistes... Passé ce moment de franche rigolade, qu'il aient la
gentillesse de m'expliquer mes erreurs (c'est aussi pour cela que
j'écris ce document : pour progresser...).</para>

<para>Avec cette DTD, on peut écrire la version XML du document que vous
êtes en train de lire et que je vous invite à consulter afin de noter
l'utilisation des balises que j'ai définies.</para>
</subsection>

<subsection titre = "Explication rapide de la syntaxe d'une DTD">

<para>Vous noterez la simplicité de la syntaxe d'une DTD XML : on
définit les balises avec :

<verbatim>
&lt;!ELEMENT nom_balise (contenu)&gt;
</verbatim>

<tt>contenu</tt> est ce qui sera contenu entre la balise ouvrante
	(&lt;nom_balise&gt;) et la balise fermante
	(&lt;/nom_balise&gt;). On peut utiliser le signe <tt>|</tt>
	pour indiquer les différentes possibilités, la virgule
	(<tt>,</tt>) pour énumérer les possibilités et les
	métacaractères <tt>+</tt>, <tt>*</tt>, <tt>?</tt> qui ont leur
	sens habituel&nbsp;: respectivement « une ou plusieurs fois »,
	« zéro ou plusieurs fois », « zéro ou une fois
	». <tt>#PCDATA</tt> désigne tout ce qui n'est pas une
	balise. <tt>EMPTY</tt> indique que cette balise ne contiendra
	rien (utile pour marquer une action, l'insertion d'une table
	des matières, par exemple).</para>

<para>Une balise peut avoir des <em>attributs</em>. Ceux-ci sont définis
	par&nbsp;:

<verbatim>
&lt;!ENTITY % groupe_attributs  liste_attributs&gt;
</verbatim>

<tt>groupe_attributs</tt> est le nom par lequel on désignera un
	ensemble d'attributs, <tt>liste_attributs</tt> est une suite de
	chaînes (entre apostrophes doubles). Chacune de ces chaînes
	est de la forme&nbsp;:

<verbatim>
"nom_attribut CDATA présence"
</verbatim>

où <tt>présence</tt> indique si l'attribut est obligatoire
	(<tt>#REQUIRED</tt> ou facultatif (<tt>#IMPLIED</tt>). Il
	existe également <tt>#FIXED</tt>... <tt>CDATA</tt> indique que
	la valeur de l'attribut sera une chaîne de caractères,
	<tt>ID</tt> que ce sera un identifiant numérique. Il existe
	également <tt>NMTOKEN</tt> dont j'ignore encore la
	signification...</para>

<para>Lorsqu'un groupe d'attributs a été défini, on l'associe à une balise
	de la façon suivante&nbsp;:

<verbatim>
&lt;!ATTLIST nom_balise %groupe_attributs;&gt;
</verbatim>
</para>

<para>Notez le point-virgule après le nom du groupe d'attributs...</para>

<para>Enfin, on définit des <em>entités</em> (des symboles spéciaux que l'on
	utilisera ensuite dans notre texte sous la forme
	<tt>&symbole;</tt> de la façon suivante&nbsp;:

<verbatim>
&lt;!ENTITY symbole code&gt;
</verbatim>

où <tt>code</tt> est une chaîne de caractères représentant le code du
	    symbole.</para>

<para>Une dernière chose, XML est sensible à la casse, respectez celle que
	    je viens de vous indiquer...</para>

<!-- Améliorer cette partie avec les remarques des spécialistes
     éventuels... -->
</subsection>

<subsection titre = "Validation d'un document XML">

<para>Passons maintenant à la validation : dans le jargon XML, un document
peut être <em>bien formé</em>, ce qui correspond au cas où les
balises sont correctement appariées. Si l'on utilise un <em>analyseur
non validant</em>, c'est exactement ce qu'il vérifiera. Notamment, si
vous avez utilisé les balises <tt>&lt;ssection&gt;</tt> et
<tt>&lt;/ssection&gt;</tt> au lieu de celles définies dans la DTD,
<tt>&lt;subsection&gt;</tt> et <tt>&lt;/subsection&gt;</tt>,
l'analyseur n'y verra que du feu puisque votre document XML est
<em>bien formé</em>.</para>

<para>Un <em>analyseur validant</em>, par contre, vérifiera que toutes les
balises employées sont définies dans la DTD que vous utilisez.</para>

<para>Pour analyser et valider notre document XML par rapport à la DTD
qu'il emploie, nous pouvons utiliser le module <tt>XML::Checker</tt>, qui
fait partie de la bibliothèque <tt>libxml-enno-1.02</tt>, disponible
sur CTAN. La création de l'analyseur validant le plus simple qui soit
consiste à écrire le script Perl suivant&nbsp;:

<verbatim>
#! /usr/bin/perl -w
# 
# Syntaxe : ./check nomfic
#           
# Analyse et valide un fichier XML
#
use XML::Checker::Parser;
use strict;

local $XML::Checker::FAIL = sub { die };

my $parser = new XML::Checker::Parser(SkipExternalDTD => 1, 
                                      ParseParamEnt => 1);
$parser->parsefile (shift);
</verbatim></para>

<para>Si l'exécution de la commande ne produit pas d'erreur, votre document
est valide.</para>

<para>On peut, bien sûr, raffiner tout cela. J'avoue ne pas avoir eu le
temps de m'y plonger mais les pages de manuel de <tt>XML::Checker</tt>
et <tt>XML::Checker::Parser</tt> contiennent pas mal d'informations
sur le paramétrage de la méthode <tt>Parser</tt>.</para>

<para>Notons également l'existence d'un analyseur validant, <url
							   nom="rxp"
							   lien="http://www.cogsci.ed.ac.uk/~richard/rxp.html"/>.
							   Son intérêt
							   est qu'il
							   ne
							   nécessite
							   rien
							   d'autre :
							   on récupère
							   les
							   sources, on
							   compile et
							   on dispose
							   d'un
							   exécutable
							   <tt>rxp</tt>
							   de 84 Ko
							   que l'on
							   peut
							   invoquer de
							   la façon
							   suivante :

<verbatim>
rxp Intro-XML.xml
</verbatim>
</para>

<para>Cette ligne de commande se chargera de vérifier que votre document et
la DTD qu'il utilise sont cohérents. À noter que <tt>rxp</tt> a
détecté des problèmes dans ma DTD qui n'avaient pas été repérés par
<tt>XML::Checker</tt>. Sa page de manuel présente ses différentes
	options.</para>
</subsection>

<subsection titre="Un mot sur l'encodage">

<para>L'encodage par défaut de XML est UTF-8, et c'est aussi
	l'encodage qu'utilise le module <tt>XML::Parser</tt>. Le
	problème est que le texte que je tape utilise l'encodage de ma
	machine, soit ISO-8859-1... D'autre part, même si je tapais
	directement de l'UTF-8, le HTML que je souhaite générer devrait
	être converti en ISO-8859-1 pour être visualisé par tout un
	chacun. Il faut donc définir une fois pour toute une politique
	d'encodage en attendant que tout cela soit reconnu partout.</para>

<para>J'ai donc choisi la solution suivante :

<liste>
<item> j'écris mes documents en ISO-8859-1, tout en indiquant dans
	    l'entête XML que le document est codé en UTF-8 ;</item>

<item> je réencode le document en UTF-8 à l'aide de l'utilitaire
	    <tt>recode</tt>&nbsp;: <tt>recode latin1..UTF8
	    nom_doc.xml</tt> afin que son traitement ait lieu en UTF-8
	    ;</item>

<item> après le traitement, je réencode en ISO-8859-1&nbsp;:
<tt>recode UTF8..latin1 nom_doc.html</tt></item>
</liste></para>

<para>C'est fastidieux, mais c'est la seule solution que j'ai trouvée et
	elle est automatisable via l'utilisation d'un
	<url nom="Makefile" lien="Makefile"/>...</para>
</subsection>

<subsection titre="Transformation en HTML">

<para>Étant donné que rien ne permet pour l'instant de visualiser
directement du XML, il faut bien passer par un format reconnu. Nous
étudierons ici comment transformer le document XML en un document
HTML (celui que vous lisez si vous utilisez en ce moment un navigateur
web).</para>

<para>Avec Perl, et le module <tt>XML::Parser</tt>, cette transformation se
borne à la création d'un script énonçant les règles de
transformation de la balise <tt>&lt;X&gt;</tt> de notre DTD en la
balise <tt>&lt;Y&gt;</tt> de HTML.</para>

<para>Ainsi, par exemple, pour que le texte compris entre
<tt>&lt;verbatim&gt;</tt> et <tt>&lt;/verbatim&gt;</tt> donne un texte
compris entre <tt>&lt;blockquote&gt;</tt><tt>&lt;pre&gt;</tt> et
<tt>&lt;/pre&gt;</tt><tt>&lt;/blockquote&gt;</tt> en HTML, il suffit
de créer deux fonctions de transformations (<em>handlers</em>, dans
la terminologie de la documentation de <tt>XML::Parser</tt>)&nbsp;:

<verbatim>
sub verbatim {
    print "&lt;blockquote&gt;&lt;pre&gt;";
}

sub verbatim_ {
    print "&lt;/pre&gt;&lt;/blockquote&gt;";
}
</verbatim></para>

<para>Le principe est simple : le handler portant le nom de la balise sera
appliqué à la rencontre de la balise ouvrante, celui portant le nom
de la balise suivi d'un <tt>_</tt> sera appliqué à la rencontre de
la balise fermante.</para>

<para>Le texte entre les deux balises est pris en compte par un handler
spécial, qui se bornera ici à reproduire le texte après quelques
transformations (principalement pour transformer les '&lt;' et les
'&gt;', etc. en leurs codes HTML).</para>

<para>Ce script s'appelle <url nom="xml2html" lien="xml2html"/> et je
vous invite à le consulter pour noter sa simplicité.</para>

<para>Il est formé de deux parties : la première crée une instance de
l'analyseur et le configure pour qu'il utilise les handlers que l'on
définira dans l'espace de noms <tt>SubHandlers</tt>, on lui précise
également que les éléments qui ne sont pas des balises seront
gérés par le handler que nous avons choisi d'appeler
<tt>char</tt>. Puis on lance l'analyse du fichier passé en paramètre
au script à l'aide de la méthode <tt>parsefile</tt>.</para>

<para>À part <tt>char</tt>, tous les handlers sont placés dans leur
propre espace de noms, qui définit également trois variables pour
mémoriser les types des listes, la numérotation des sections et des
sous-sections.</para>

<para>On notera que la majeure partie de ces fonctions se bornent à
afficher sur la sortie standard une balise HTML. Mais certaines des
balises XML que nous avons définies, <tt>article</tt>,
<tt>section</tt>, <tt>subsection</tt>, <tt>liste</tt> et <tt>url</tt>
utilisent des attributs dont il faudra bien tenir compte lors de la
transformation.</para>

<para>En fait, chacun de ces handlers recoivent des paramètres lorsqu'ils
sont appelés. Ces paramètres sont, dans l'ordre&nbsp;:

<liste>
<item> le descripteur de l'analyseur ;</item>
<item> le nom de la balise; </item>
<item> et, éventuellement, les attributs de celles-ci sous la forme de
	    paires nom/valeur.</item>
</liste></para>

<para>Ainsi, le handler <tt>url</tt> reçoit la liste d'attribut <tt>($p,
$balise, %attribs)</tt> (dans <tt>@_</tt>).</para>

<para>Nous nous débarrassons des deux premiers car ils ne nous intéressent
pas ici, et nous passons au traitement du troisième, qui sera
considéré comme un hachage dont les clés sont les noms des
attributs et les valeurs seront celles qui nous intéressent. Ainsi,
<tt>$attribs{nom}</tt> contient le texte qui s'affichera, tandis que
<tt>$attribs{lien}</tt> contient l'URL vers lequel pointe le lien.</para>

<para>Le traitement des listes suit le même principe : il est un peu plus
complexe car l'on doit mémoriser le type de la liste que l'on a
ouverte pour pouvoir la fermer correctement. Les listes pouvant être
imbriquées, nous avons choisi d'utiliser un tableau,
<tt>types_listes</tt>, que nous gérons comme une pile.</para>
</subsection>

<subsection titre="Transformation en LaTeX">

<para>La transformation en LaTeX suit exactement le même principe sauf
	qu'au lieu de générer des balises HTML, on génère des
	marqueurs LaTeX. Le script <url nom="xml2tex"
	lien="xml2tex"/>, fourni avec les sources de ce document,
	s'acquitte de cette tâche.</para>
</subsection>

<subsection titre="Transformation en DocBook">

<para>Un des intérêts des transformations est de pouvoir passer d'une DTD à
	l'autre. Cette transformation suit le même principe que les
	précédentes : à une balise de ma DTD, j'associe une balise
	DocBook... Le script <url nom="xml2dbk" lien="xml2dbk"/>
	permet de générer un fichier DocBook pouvant être ensuite
	traité par <tt>jade</tt> (voir le fichier <url nom="Makefile.dbk"
	lien="Makefile.dbk"/>).</para>

<para>On notera aussi qu'il existe des mécanismes plus élaborés pour
	réaliser cette conversion. À l'heure qu'il est, je n'ai pas
	encore eu le temps de m'y pencher. Quand ce sera fait,
	j'ajouterai une section (toutes les contributions sur le sujet
	sont les bienvenues).</para>
</subsection>
</section>

<section titre="Conclusion temporaire">

<para>J'espère vous avoir convaincu de la puissance de ce type de
génération de document. De sa portabilité, aussi car il suffit
d'une archive contenant les fichiers XML et DTD et les scripts Perl
permettant de générer les formats pour que le destinataire puisse
produire les formats qu'il désire (moyennant l'installation de
<tt>XML::Parser</tt>).</para>

<para>Vous remarquerez que l'extension de ce procédé à tout format connu
consiste, finalement, à écrire les handlers de gestion des
balises. Vous pouvez d'ailleurs jeter un coup d'oeil au script <url
nom="xml2tex" lien="xml2tex"/> qui transforme tout document
utilisant ma DTD en fichier LaTeX (ces deux scripts sont encore
imparfaits, mais j'y travaille...).</para>

<para>Cette extension s'applique à la DTD : l'ajout d'une nouvelle balise
passe par sa déclaration dans la DTD et par sa prise en compte dans
les scripts.</para>

<para>Les heureux utilisateurs de Emacs et de PSGML seront ravis d'apprendre
que celui-ci leur facilitera la saisie de leurs documents XML en
prenant en compte leur DTD et en insérant automatiquement les balises
et attributs qu'ils ont définis.</para>

<para>Ce document n'est encore qu'un brouillon (cf. son numéro de
version). Je compte sur les relectures et les suggestions pour le
faire évoluer vers une version débarrassée des imprécisions et
erreurs.</para>
</section>

<section titre="Références">

<liste>
<item><url nom="Les cahiers Gutenberg"
	   lien="http://www.gutenberg.eu.org/pub/GUTenberg/publications/cahiers.html#Cahier33-34"/></item>
<item><url nom="XML-Fr"
	   lien="http://xmlfr.org/actualites/tech/000314-0003.xml"/></item>
<item><url nom="XML and Scripting Languages"
	   lien="http://www-4.ibm.com/software/developer/library/xml-perl"/></item>

<item><url nom="The Debian SGML-HOWTO"
	   lien="http://www.debian.org/~bortz/SGML-HOWTO/"/></item>

<item><url nom="rxp"
           lien="http://www.cogsci.ed.ac.uk/~richard/rxp.html"/></item>
</liste>
</section>

<section titre="Remerciements">

<para>Je remercie tous ceux qui ont répondu aux questions que j'ai posées
dans <tt>fr.comp.text.xml</tt>, notamment <em>Thierry Bezecourt</em>,
<em>Jean-François Billaud</em>, <em>Xavier Cazin</em> et <em>Jérôme
Mainaud</em>. Merci également à <em>Stéphane Bortzmeyer</em> pour
m'avoir convaincu de l'intérêt des DTD pour la production de documents
structurés.</para>

<para>Ce document a été soumis à la sagacité de <em>Xavier
	Cazin</em> et <em>Olivier Tharan</em>.</para>
</section>
  </corps>
</article>
