Accueil

Automatisez la gestion de vos pages HTML... grâce à XML ! (suite)

Afficher plein écran
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&egrave;me de politique positive ou Trait&eacute; de sociologie instituant la religion de l'humanit&eacute; / 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, "&apos;"), ".")'/></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.