<sect>Linux, Java et XML
<p>Par Eoin Lane

<sect1>Résumé
Cet article est une introduction fondamentale à XML, le nouveau
langage hypertexte de la toile, et au langage de transformation
XSL. Je montrerai comment configurer le serveur web Apache en
utilisant le moteur servlet JServ pour effectuer la partie client de
la transformation XML/XSL, en utilisant le servlet Cocoon d'Apache. 
<p>
Vous trouverez les futures mises à jour de cet article sur <url
url="http:/www.inconn.ie/article/cocoon.htm"> (le nom de domaine
n'est pas opérationnel actuellement mais le sera bientôt). 

<sect1>Introduction
<p>
<em>Le langage hypertexte extensible</em> (XML) est un nouveau langage
hypertexte web (il a obtenu l'agrément ISO en février 1999). C'est un
outil puissant destiné à séparer le contenu web du style. Il a été
écrit beaucoup de choses au sujet de XML, mais pour les utiliser de
façon réelle dans la conception web, les tschnologies y afférant
doivent être comprises. Pour ce faire, j'ai ajouté mes deux centimes à
la grande masse de littérature qui existe sur le sujet. Cet article
n'a pas pour but d'apprendre XML, ni d'explorer au maximum ses
possibilités, mais c'est un moyen pour que les technologies relatives
à XML puissent être mises en pratique immédiatement. 

<p>
Avant d'aller plus loin, je vous suggère deux sites où vous pourrez
obtenir l'information définitive sur XML. Le premier est le site du
<em>World Wide Web Consortium (W3C)</em> sur <url
url="http://www.w3.org/">. W3C est responsable de la spécification
XML. Le second est un site de <em>Questions Fréquemment Posées</em>
sur XML <url url="http://www.ucc.ie/xml/"> qui répondra aux autres
questions. Je vous recommande également les pages XML hébergées par
IBM sur <url url="http://www.ibm.com/xml/">, où vous pourrez trouver
un large éventail d'excellents tutoriels et articles sur XML. 

<p>
Le langage originel de la toile, SGML (depuis 1986 environ) est le
père de tous les langages hypertextes. SGML peut être utilisé pour
documenter tous les systèmes imaginables~; depuis la conception
aéronautique complexe jusqu'aux dialectes chinois anciens. Cependant,
il souffre de sa complexité et de son maniement peu aisé pour les
applications web usuelles. HTML est à la base une version très
raccourcie de SGML, à l'origine conçu avec l'esprit de publication de
la communauté scientifique. C'est un simple langage hypertexte (il a
été dit "quiconque le veut peut l'apprendre") et avec l'explosion du
web, il est évident que les gens bien informés en ont témoigné. Depuis
sa création, le web a évolué en complexité et a enfin dépassé le stade
de ses lents débuts dans la communauté scientifique.

<p>
Aujourd'hui les pages internet doivent être dynamiques, interactives,
exploitables en arrière-plan avec des bases de données, sécurisées, et
attirantes à l'oeil pour être compétitives dans un cyberespace
toujours plus peuplé. Entrez dans XML, un nouveau langage de balisage
pour traiter les complexités de la conception du web actuel. XML ne
représente que 20% de la complexité de SGML et peut manipuler 80% des
fichiers SGML (croyez-moi lorsqu'il s'agit du code des dialectes
chinois anciens, 80% en contiennent). Dans la section suivante, je
comparerai brièvement deux exemples de marquage, un en HTML et le
second en XML, en démontrant les avantages d'une approche XML. Dans la
section finale, je montrerai comment installer un serveur web Apache
pour traiter un document XML afin que vous puissiez commencer
immédiatement à utiliser XML dans votre conception web. 

<sect1>HTML
<p>
L'exemple qui suit est très simple, pour que chacun puisse se familiariser~:

<code>
&lt;html&gt;
 &lt;head&gt;
   &lt;title&gt;C'est mon article&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
   &lt;h1 align=&dquot;center&dquot;&gt;C'est mon article&lt;h1&gt;
   &lt;h1 align=&dquot;center&dquot;&gt;par &lt;a href=&dquot;mailto:eoinlane@esatclear.ie&dquot;&gt;EoinLane&lt;/a&gt;&lt;/h3&gt;
   ...
  &lt;/body&gt;
&lt;html&gt;
</code>

Deux points importants sont à souligner dans ce document.

<itemize>
<item>
Le contenu et le style sont liés entre eux dans le document
<item>
Il serait très difficile pour un programme de recherche, de rechercher
ce document et d'extraire l'adresse e-mail d'Eoin Lane.
</itemize>

XML résout ces deux problèmes.

<sect1>XML
<p>
L'équivalent en XML se présente comme suit~:

<tscreen><verb>
&lt;?xml version=&dquot;1.0&dquot;?&gt;
&lt;page&gt;
 &lt;titre&gt;C'est mon article&lt;/titre&gt;
  &lt;author&gt;
   &lt;nom&gt;Eoin Lane&gt;/nom&gt;
   &lt;mel&gt;eoinlane@esatclear.ie&lt;/mel&gt;
  &lt;/author&gt;
  ...
&lt;/page&gt;
</verb></tscreen>


<p>
La première chose est de remarquer que ce document, comme d'autres
documents XML valides, est <em>bien formé</em>. Pour obtenir un
document <em>bien formé</em> chaque balise doit avoir un crochet
ouvert et un crochet fermé. Un progamme de recherche d'adresses de
courrier doit ensuite localiser le texte entre les balises ouvert et
fermé du <em>courrier</em>. 
<p>
Le second point crucial est que ce document XML contient seulement des
données. Il n'y a rien dans ce document qui impose la manière
d'afficher le nom de l'auteur ou son adresse e-mail. En pratique, il
est plus facile de penser de façon séparée la conception web en termes
de données et de présentation. Dans la conception de sites moyens et
de grands sites, où toutes les pages ont la même apparence et où seules
les données changent de page en page, c'est évidemment une
meilleure solution. Elle autorise également un partage du travail où
style et contenu peuvent être manipulés par deux départements
différents travaillant de façon indépendante. Elle autorise également
la possibilité d'avoir un jeu de données avec un certain nombre de
présentations.

<p>
Un document XML peut être présenté en utilisant deux méthodes
différentes. L'une utilise une Feuille de Style en Cascade (CSS)
(reportez-vous à <url url="http://www.W3.org/style/css/">) pour
baliser le texte en HTML. La seconde utilise un langage de
transformation appelé XSL, qui convertit le document XML en HTML, XML,
pdf, ps ou Latex. Quant à savoir lequel utiliser, W3C (les
responsables de cette spécification) disent ceci :
<bf>Utilisez CSS lorsque vous le pouvez, utilisez XSL lorsque vous le devez</bf>

<p>
Ils déclarent également~: <em>La raison est que CSS est beaucoup plus
facile à utiliser, plus facile à apprendre, donc plus facile à
maintenir et moins onéreuse. Il existe des éditeurs WYSIWYG pour CSS
et il y a généralement plus d'outils pour CSS que pour XSL. Mais la
simplicité de CSS signifie qu'elle a ses limites, certaines fonctions
que vous ne pourrez effectuer avec CSS, ou avec CSS seule. Vous aurez
alors besoin de XSL, ou du moins de la partie transformation de XSL.</em>
<p>
<em>Quelles sont donc les actions que vous ne pouvez effectuer avec
CSS~? En général tout ce qui nécessite des transformations. Par
exemple, si vous avez une liste que vous voulez afficher en ordre
alphabétique, si des mots doivent être remplacés par d'autres, ou si
des éléments vides doivent être remplacés par du texte. CSS peut
effectuer une génération de texte, mais seulement pour des tâches
limitées, comme des numéros d'en-têtes de sections.</em>
</sect>

<sect1>XSL
<p>
XSL (Langage de Feuille de Style eXtensible) est le langage utilisé
pour transformer et afficher des documents XML. Il n'est pas encore
dans sa version définitive, donc méfiez-vous~! C'est un langage de
formatage de document complexe qui est en lui-même un document XML. Il
peut être subdivisé en deux parties : transformation (XSLT) et
formatage d'objets (quelquefois comme FO, XSL:FO ou simplement XSL). 
Pour plus de simplicité je traiterai seulement de XSLT ici.

<bf>Transformations XSL (XSLT)</bf>
<p>
Le 16 novembre 1999, le World Wide Web Consortium a annoncé la
publication de XSLT comme Recommandation W3C. Ce qui signifie
essentiellement que XSLT est stable et ne changera pas dans
l'avenir. Le document XML ci-dessus peut être transformé en document
HTML, et en conséquence affiché sur n'importe quel navigateur en
utilisant le fichier XSLT suivant~:
<tscreen><verb>
&lt;?xml version=&dquot;1.0&dquot;?&gt;
&lt;xsl:stylesheet xmlns:xsl=&dquot;http://www.w3.org/XSL/Transform/1.0&dquot;&gt;

 &lt;xsl:template match=&dquot;page&dquot;&gt;
  &lt;html&gt;
   &lt;head&gt;
    &lt;title&gt;
    &lt;xsl:value&shy;of select=&dquot;title&dquot;/&gt;
   &lt;/title&gt;
  &lt;/head&gt;
  &lt;body bgcolor=&dquot;&num;ffffff&dquot;&gt;
   &lt;xsl:apply=templates/&gt;
  &lt;body&gt;
 &lt;/html&gt;
&lt;/xsl:template&gt;

&lt;xsl:template match=&dquot;title&dquot&gt;
 &lt;h1 align=&dquot;center&dquot;&gt;
  &lt;xsl:apply&shy;templates/&gt;
   &lt;h3 align=&dquot;center &dquot;&gt;
      by &lt;xsl:apply&shy;templates/&gt;
   &lt;/h3&gt;
  &lt;/xsl:template&gt;

 &lt;xsl:template match=&dquot;mail&dquot;&gt;
  &lt;h2 align=&dquot;left&dquot;&gt;
   &lt;xsl:apply&shy;templates/&dquot;&gt;
  &lt;/h2&gt;
 &lt;/xsl:template&gt;

&lt;/xsl:stylesheet&gt;
</verb></tscreen>

<p>
Pour en savoir plus sur XSLT, je vous recommande le site <url
url="http://www.xlinfo.com/"> comme un bon point de départ. J'ai
également trouvé excellent le chapitre 14 révisé, de la Bible
XML. Cette révision est basée sur les spécifications qui sont devenues
par la suite la recommandation.

<p>
Avec l'arrivée de la génération suivante de navigateurs,
<em>c'est-à-dire</em> Netscape 5 actuellement en construction <url
url="http://www.mozilla.org/">, cette transformation côté client peut
être effectuée. Lorsque le fichier XML est requis, le fichier XSL
correspondant sera envoyé avec, et la transformation sera effectuée
par le navigateur. Actuellement, il y a beaucoup de navigateurs
capables d'afficher seulement du HTML, et jusqu'à ce que la
transformation soit effectuée ensuite côté serveur. Cette tâche peut
être accomplie en utilisant les servlets Java (programmes additionnels
du serveur Java).

<p>
Le servlet Cocoon est identique à un servlet, écrit par quelques
personnes très intelligentes chez Apache <url
url="http://www.apache.org/">. A la base, il prend un document XML et
le transforme en utilisant un document XSL. Un exemple de cette
transformation est la conversion du document XML en document HTML pour
que le navigateur puisse l'afficher. Donc si votre serveur web est
configuré pour faire fonctionner les servlets, et si vous incluez le
servlet cocoon, vous pouvez alors lancer la conception de vos pages
web en utilisant XML. Le reste de cet article montrera exactement
comment effectuer cette opération. 

<sect1>Comment faire~?

<p>
J'ai testé les instructions suivantes sur une installation récente de
Red Hat 6.0, donc je sais qu'elle fonctionne. 

<sect2>Le serveur Web Apache
<p>
Installez d'abord le serveur web Apache. Sur Red Hat, cette fonction
est livrée pré-installée mais je préfère que vous la supprimiez en
utilisant~: 

<tt>rpm -e --nodeps apache</tt>

Ne vous souciez pas des messages d'erreur. Ensuite procurez-vous la
version d'Apache la plus récente sur <url
url="http://www/apache.org/"> (actuellement version 1.3.9) et
copiez-la dans une emplacement pratique. J'ai installé la mienne dans
<bf>/usr/local/src/</bf>. Désarchivez et décompressez le fichier en
utilisant~:

<tt>tar zxvf apache_1.3.9.tar.gz</tt>

<p>
Ce qui décompactera Apache dans le répertoire
<bf>/usr/local/src/apache_1.3.9</bf>. Entrez dans ce répertoire, 
configurez, construisez et installez l'application en utilisant les
commandes suivantes~:

<verb>
./configure --prefix)/usr/local/apache --mandir=/usr/local/man --enable-shared=max
make
make install
</verb>

<p>
Ces commandes permettront d'installer Apache dans le répertoire
<bf>/usr/local/apache</bf>, et il est important de remarquer ici le
fichier <bf>http.conf</bf>, que vous pourrez trouver dans le
répertoire <bf>/usr/local/apache/conf</bf>. Ce fichier contient la
plupart des informations importantes nécessaires pour faire tourner
Apache correctement. Il contient des informations sur la provenance
des documents web, des serveurs web virtuels et des dossiers
aliases. Nous reviendrons brièvement sur ce fichier, donc
familiarisez-vous avec sa présentation générale. A ce stade, j'ai dû
redémarrer Linux et lancer ensuite Apache en utilisant l'instruction
suivante~: 

<tt>/usr/local/apache/bin/apachect1 start</tt>

<p>
Pour le tester, faites pointer votre navigateur sur <url
url="http://localhost/">, et vous y êtes, espérons-le ! Pour une bonne 
conception et une bonne organisation, je vous renvoie à un article que
j'ai trouvé extrêmement utile pour configurer mon propre site~: Pour
une Meilleure Conception des Pages Web sous Linux, écrit par Chris
Gibbs (Linux Gazette n°4243, traduit en français par Joëlle 
Cornavin).

<sect2>Java et JSDK
<p>
En octobre, IBM a sorti le Kit 1.1.8 Java de Développement pour
Linux. Il est plus rapide que les JSDK correspondants de Blackdown,
qui se trouvent sur <url url="http://blackdown.org/">, et de
Sun. Téléchargez JDK d'IBM (consultez <url
url="http://www.ibm.com/java/">). A nouveau, décompressez celui-ci
dans le répertoire <bf>/usr/local/src/jdk118</bf>. Ensuite,
téléchargez le logiciel JSDK2.0 de JavaSoft, la version Solaris (non
JSDK2.1 ou n'importe quelle autre variante que vous seriez amené(e) à
obtenir), désarchivez-la  et décompactez-la - je l'ai également
installée dans <bf>/usr/local/src/JSDK2.0</bf>. Ajoutez la commande
suivante ou équivalente à <bf>/etc/profile</bf> pour les rendre
accessibles sur votre système. 

<tscreen><verb>
JAVA_HOME="/usr/local/src/jdk118"
JSDK_HOME="/usr/local/src/JSDK2.0"
CLASSPATH="$JAVA_HOME/lib/classes.zip:$JSDK_HOME/lib/jsdk.jar"
PATH="$JAVA_HOME/bin:$JSDK_HOME/bin:$PATH"
export PATH CLASSPATH JAVA_HOME JSDK_HOME
</verb></tscreen>

Pour les tester, lancez :

java -version

à l'invite de la commande, et vous pouvez revenir au message suivant :

<tscreen><verb>
java version "1.1.8"
</verb></tscreen>

et pour tester le kit de développement, lancez :

servletrunner

et si tout se passe bien, vous pouvez revenir au message suivant :

<tscreen><verb>
servletrunner starting with settings:
port = 8080
backlog = 50
max handlers = 100
servlet dir = ./examples
document dir = ./examples
servlet propfile = ./examples/servlet.properties
</verb></tscreen>

Nous sommes maintenant prêts à installer le moteur servlet d'Apache, ApacheJServ.

<sect2>APacheServJ
<p>
A nouveau, téléchargez le dernier ApacheServ (version 1.0 en ce
moment, bien que la version 1.1 en soit au stade beta final) depuis le
site Java d'Apache <url url="http://java.apache.org/"> et
décompactez-le dans <bf>/usr/local/src/ApacheJServ-1.0/</bf>. Tapez
configure, make et make install en utilisant les instructions
suivantes~:

<verb>
./configure --with-apache-install=/usr/local/apache --with-jsdk=/usr/local/src/JSDK2.0
make
make install
</verb>

<p>
Lorsque cette opération a été effectuée avec succès, ajoutez la ligne
suivante à la fin du fichier <bf>http.conf</bf> auquel j'ai fait
référence plus haut lors de l'installation du serveur web Apache~:

<tscreen><verb>
Include /usr/local/src/ApacheJServ-1.0/example/jserv.conf
</verb></tscreen>

et redémarrez le serveur web en utilisant~:

<tt>/usr/local/apache/bin/apachect1 restart</tt>

<p>
Le moment de vérité est maintenant arrivé, pointez votre navigateur
Internet sur <url url="http://localhost/example/Hello"> et si vous
revenez en arrière sur les deux lignes suivantes~: 

<tscreen><verb>
Example Apache JServ Servlet
congratulations, Apache JServ is working!
</verb></tscreen>

Alors, vous y êtes presque.

<sect2>Cocoon
<p>
Enfin, téléchargez la dernière version de Cocoon (actuellement version
1.5) sur le site Java d'Apache <url
url="http://www.java.apache.org/">. Cocoon est distribué comme un
fichier Java archivé et peut être extrait en utilisant la commande
<em>jar</em>. Créez d'abord le répertoire
<bf>/usr/local/src/cocoon</bf> et décompactez ensuite le fichier jar
cocon dedans~: 

<verb>
mkdir /usr/local/src/cocoon
jar -xvf Cocoon_1.5.jar
</verb>

Maintenant il s'agit de configurer le moteur JServ pour reconnaître un
fichier avec une extension .xml et d'utiliser le processus servlet
cocoon et de le faire fonctionner.

Cherchez le fichier <bf>jserv.properties</bf> que vous trouverez dans
le répertoire <bf>/usr/local/src/ApacheJServ-1.0/example/</bf> et à la
fin de la section qui commence par :

<tscreen><verb>
# CLASSPATH environment value passed to the JVM
</verb></tscreen>

ajoutez la commande suivante :

<tscreen><verb>
wrapper.classpath=/usr/local/src/coccon/bin/xxx.jar
</verb></tscreen>

Dans le cas de Cocoon 1.5, ceci signifie que vous devez ajouter les trois lignes suivantes :

<tscreen><verb>
wrapper.classpath=/usr/local.src/cocoon/bin/fop.0110.jar
wrapper.classpath=/usr/local/src/cocoon/bin/openxml.106-fix.jar
wrapper.classpath=/usr/local/src/cocoon/bin/xslp.19991017-fix.jar
</verb></tscreen>

Toutefois, ces fichiers seront modifiés avec les différentes
versions. Cherchez alors Le fichier suivant,
<em>example.properties</em>, qui se trouve lui aussi dans le
répertoire <em>/usr/local/src/ApacheJServ-1.0/example/</em> 
et ajoutez la ligne suivante :

<tt>
repositories=/usr/local/src/cocoon/bin/Cocoon,jar
</tt>

Dans mon fichier <em>example.properties</em>, vous deviez modifier la ligne :

<tscreen><verb>
repositories=/usr/local/src/ApacheJServ-1.0/example
</verb></tscreen>

pour celle-ci :

<tscreen><verb>
repositories=/usr/local/src/ApacheJServ-1.0/example, /usr/locale/src/cocoon/bin/Cocoon.jar
</verb></tscreen>

Ajoutez également la ligne suivante à la fin du fichier <bf>example.properties</bf> :

<tscreen><verb>
servlet.org.apache.cocoon.Cocoon.initArgs=properties=/usr/local/src/cocoon/bin/Cocoon.jar
</verb></tscreen>

<p>
Le moteur JServ est maintenant correctement configuré et tout ce qui
nous reste à faire est d'indiquer à Apache de diriger n'importe quel
appel d'un fichier XML (ou n'importe quel fichier que vous voulez
confier à Cocoon) au servlet Cocoon. Pour cela, nous avons besoin du
fichier de configuration JServ~: <bf>jserv.conf</bf> mentionné plus
haut (à nouveau dans le même répertoire). Ajoutez la ligne suivante :

<tscreen><verb>
ApJServAction .xml/example/org.apache.cocoon.Cocoon
</verb></tscreen>

Pour accéder à la documentation et aux exemples de Cocoon, ajoutez la
ligne suivante à la section <em>alias</em> de votre fichier
<bf>http.conf</bf>~: 

<tscreen><verb>
Alias /xml/ "/usr/local/src/cocoon/"

&lt;Directory &dquot;/usr/local/src/cocoon/&dquot;&gt;
 Options Indexes MultiViews
 AllowOverride None
 Order allow,deny
 Allow from all
&lt;/Directory&gt;

Alias /xml/example/"/usr/local/src/cocoon/example/"

&lt;Directory &dquot;/usr/local/src/cocoon/example/&dquot;&gt;
  Options Indexes MultiViews
  AllowsOverride None
  Order allow,deny
  Allow from all
&lt;/Directory&gt;
</verb></tscreen>

Redémarrez le navigateur pour que les modifications prennent effet~:

/usr/local/apache/bin/apachect1 restart

<p>
Pointez maintenant votre navigateur sur <url
url="http://localhost/xml/"> pour explorer la documentation et <url
url="http://localhost/xml/example/"> pour essayer les exemples. Si
Cocoon réclame un supplément de mémoire, ouvrez alors le fichier
<bf>cocoon.properties</bf> qui se trouve dans le répertoire
<bf>/usr/local/src/cocoon/</bf>. Cherchez la ligne~:

<em>
store.memory = 150000
</em>

<p>
et modifiez-la en mettant un nombre inférieur à 15000. Pour essayer
les exemples PDF, qui sont faciles je pense, vous devrez avoir
installé Acrobat Reader comme programme additionnel (plug-in) de
Netscape, mais le jeu en vaut la chandelle.

<sect1>Cocoon 2

<p>
La série Cocoon 1.x est essentiellement un travail en évolution
permanente. Ce qui a démarré comme un simple servlet pour la
transformation de XSL statique a évolué en un projet beaucoup plus
important. Avec ce développement grandissant, les considérations de
conception prises au début du projet en gênent maintenant les
développements futurs alors que son importance et son envergure sont
évidentes. Pour ajouter à cela, XSL est aussi un travail en évolution,
bien que la version actuelle de XSLT soit devenue une Recommandation
W3C (le 16 novembre 1999). 

<p>
Cocoon 2 projette de résoudre ces problèmes et nous fournit un servlet
pour les transformations XML de taille à gérer de grandes quantités de
trafic web. La conception Web de sites moyens et grands dans l'avenir
est entièrement basée sur XML, puisque ses avantages deviennent
évidents, et le servlet Cocoon 2 nous fournira, espérons-le, un moyen
de l'utiliser de façon concrète.

<sect1>Conclusions
<p>
Au moment où j'ai écrit cet article, Apache a ouvert un nouveau site
dédié exclusivement à XML (consultez <url
url="http://xml.apache.org/">). Le projet cocoon a évolué de façon
évidente au delà de toute attente, et le nouveau Cocoon 2 sera un
servlet commercialement viable pour rendre possible la conception de
sites web en XML. Les gens d'Apache méritent de nombreux remerciements
pour ce travail, donc écrivez-leur et remerciez-les, rejoignez la
liste de discussion et donnez votre appui en général. Après tout,
c'est du code open source et c'est dans l'esprit de Linux.

<itemize>
<item>lane.xml : Une version XML de cet article
<item>lane.xsl : Sa feuille de style en XSL
<item>lane.xml.txt : Une version texte de la source XML
<item>lane.xsl.txt : Une version texte de la source XSL
</itemize>

<p>
Copyright &copy;1999, Eoin Lane. Publié dans le numéro 48 de Linux Gazette, Décembre 1999
<p>
Traduction française Joëlle Cornavin <url url="jcornavi@club-internet.fr">

