Emmanuel
Lazinier
Création de la page : 2000-07-24
Dernière mise à jour : 2000-07-26
Deuxième partie : Epurer un fichier XML "clone" grâce à
XSLT
Dans la première partie de cette article nous
avons appris comment "cloner" un fichier HTML en XML. Nous allons maintenant
voir comment épurer le fichier XML clone pour en faire un fichier
XML "propre", c'est-à-dire reflétant exactement les données,
et elles seules, contenues dans la page HTML initiale.
Un exemple : récupérer un fichier de pointeurs
Comme certains d'entre vous le savent, je suis aussi le webmestre du site
philosophique Auguste Comte
et le positivisme. En cette qualité je suis allé récemment
faire un tour sur le site "Gallica"
de la Bibliothèque Nationale de France afin d'y faire moisson de
pointeurs vers les nombreux ouvrages numérisés d'Auguste
Comte disponibles sur leur serveur. Une désagréable suprise
m'y attendait. Une interrogation de leur catalogue
avec le critère
de recherche auteur="Auguste Comte" ne fournit pas tous les ouvrages
disponibles ! Pour les avoir tous il est nécessaire d'utiliser
le critère
auteur="Comte". On obtient ainsi tous les ouvrages de Comte, mais,
évidemment, noyés parmi ceux d'un tas d'autres auteurs de
même patronyme ou décorés du titre de comte ! Carton
rouge pour la BNF !
J'en étais donc réduit, faute de pouvoir fournir un pointeur
vers une liste complète et "propre", à m'en constituer une
moi-même. A ce moment-là, je m'aperçus que le HTML
généré par Gallica était d'une rare complexité.
HTML produit par Gallica
<HTML>
<HEAD>
<SCRIPT LANGUAGE="JavaScript">
.............
function Consulter(fichier) {
ordre=fichier.substring(0,fichier.lastIndexOf('.'));
window.open('/scripts/ConsultationTout.exe?O='+ordre,'_blank');
}
function Notice(fichier) {
ordre=fichier.substring(0,fichier.lastIndexOf('.'));
NouvelleFenetre('http://catalognum.bnf.fr/notice.htm?O='+ordre)
}
........
</SCRIPT>
</HEAD>
<BODY>
........
<table width=100% border=0>
<tr>
<td>
1. Système de politique positive ou Traité de
sociologie instituant la religion de l'humanité / par Auguste
Comte,... Tome premier
<td valign=top align=center width=2%>
<A href="javascript:Consulter('n005449.htm')" onmouseover="top.status='Consulter
l\'ouvrage';return true">
<IMG ALIGN="right" ALT="Consulter l'ouvrage" SRC="/icones/icon_imp.gif"
border=0></A>
<td valign=top width=3%>
<A HREF="javascript:Notice('n005449.htm')" onmouseover="top.status='Voir
la notice';return true">
<IMG ALIGN="right" ALT="Voir la notice" SRC="/icones/icon_not.gif"
border=0></A>
</table>
............
</BODY>
</HTML>
Où l'on voit que sur ces pages les liens sont fabriqués par
des scripts qui concatènent une base de lien avec l'identificateur
propre à chaque ouvrage... Allais-je devoir reproduire une telle
complexité sur mon propre site ?
C'est à ce moment que l'archange XML vola à mon secours."Epurons",
me souffla-t-il à l'oreille.
Docilement, je transformai aussitôt le HTML gallicesque
en XML par Tidy, puis je soumis le résultat
à une radicale transformation XSLT à l'aide de la feuille
de style suivante :
Feuille de style de "nettoyage"
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml" encoding="ISO-8859-1"/>
<xsl:template match="/">
<xsl:processing-instruction name="xml-stylesheet">href="affiche.xsl"
type="text/xsl" </xsl:processing-instruction>
<livres>
<xsl:apply-templates select="//table[.//td[2]/a/img]"/>
<!-- Le test sur l'image permet d'éliminer des tableaux non
pertinents. Le "// "entre "table" et "td" permet de prendre en compte d'éventuelles
balises "tbody" s'intercalant entre "table" et "tr" -->
</livres>
</xsl:template>
<xsl:template match="//table[.//td[2]/a/img]">
<livre>
<titre><xsl:value-of select='substring-after(.//td[1], ". ")'/></titre>
<reference> <xsl:value-of select='substring-before(substring-after(.//td[2]/a/@href,
"'"), ".")'/></reference>
</livre>
</xsl:template>
</xsl:stylesheet>
J'ai pu ainsi produire un fichier de la forme :
Fichier XML "propre"
<?xml version="1.0" encoding="ISO-8859-1"?>
<livres>
.............
<livre>
<titre>Système de politique
positive ou Traité de sociologie instituant la religion de l'humanité
/ par Auguste Comte,... Tome premier</titre>
<reference>n005449</reference>
</livre>
...............
</livres>
Ce qui est quand même beaucoup plus satisfaisant, et qui m'a permis
de regénérer sur mon site "Auguste Comte" une page équivalente
à la page d'origine avec la simple feuille de style suivante :
Feuille de style d'affichage
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="html" encoding="ISO-8859-1"/>
<xsl:template match="/">
<html>
<body>
<H1>Etextes d'Auguste Comte à la BNF</H1>
<ul>
<xsl:apply-templates select="livres/livre" />
</ul>
</body></html>
</xsl:template>
<xsl:template match="livre">
<li>
<em><xsl:value-of select='titre'/></em>,
<a
href="{concat('http://gallica.bnf.fr/scripts/ConsultationTout.exe?O=',
reference, '_blank')}">
Ouvrage</a>,
<a href="{concat('http://catalognum.bnf.fr/notice.htm?O=', reference)}">
Notice</a>
</li>
</xsl:template>
</xsl:stylesheet>
Voir
le résultat.
Retour à la page d'accueil.