Une page html vous affiche un tableau de valeurs organisé sous forme liste html. Vous souhaitez transférer ce tableau dans une feuille de calcul OpenOffice.
Si le tableau original était un tableau html, un simple copier-coller ferait l'affaire. Mais ce n'est pas le cas, il faut donc effectuer une transformation plus élaborée.
Il existe des bibliothèques de transformation capables de déduire l'organisation d'un structure de données et d'autres bibliothèques capables de la convertir vers une autre structure, un autre format. Mais rien ne vous garantit que ces bibliothèques seront opérantes dans le cas qui vous intéresse.
Nous allons donc étudier un cas concret. L'intérêt est de montrer quelques outils utilisables pour effectuer cette transformation de manière semi-automatique. L'objectif est de donner les éléments de solution permettant de traiter tout cas particulier que vous pourriez rencontrer.
La solution présentée ne prétend être optimale. Elle n'a d'autre valeur qu'illustrative. Il s'agit d'un vote dans une assemblée parlementaire du Conseil de l'Europe, telle que diffusée sur le site officiel de cette instance.
La structure de départ simplifiée est la suivante : <ol><li><span>vote</span><a>Membre></a><span>Code pays</span><span>Groupe politique</span>. On le voit, chaque champ n'est pas représenté par le même élément html : tantôt un span, tantôt un a.
^(.*)\ -
$1
À ce stade, vous disposez d'un tableau prêt à être utilisé, manipulé et exporté.
Dans l'exemple traité, la feuille suivante a été utilisée :
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <h1>Vote de la résolution</h1> <h2>Résultats du vote</h2> <table border="1"> <tr bgcolor="#9acd32"> <th style="text-align:left">Vote</th> <th style="text-align:left">Pays</th> <th style="text-align:left">Groupe</th> <th style="text-align:left">Membre</th> </tr> <xsl:for-each select="ul/li"> <tr> <td><xsl:value-of select="span"/></td> <td><xsl:value-of select="span[2]"/></td> <td><xsl:value-of select="span[3]"/></td> <td><xsl:value-of select="a"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
Pour de multiples raisons, la technique d'extraction initiale des données via l'inspecteur peut ne pas fonctionner. Dans ce cas, il suffit de récupérer le code source de la page (^U) dans une autre page.
Je vous recommande de copier-coller le contenu de la page3) dans un bon éditeur syntaxique4) où l'on pourra reformater le contenu et extraire l'élément englobant les données voulues, de manière fiable, sans tâtonner sur le parenthésage.
La procédure présentée ci-avant peut être largement améliorée, en fonction du contexte d'utilisation.
Si la page html est elle-même le résultat d'une génération automatique et si l'on doit fréquemment faire ce type d'extraction des données, on pourra :
Sauf cas particulier, on conservera une transformation interactive permettant de s'assurer que la feuille de style XSLT est toujours valable. En effet, l'éditeur du site web original ne prend aucun engagement de stabilité de sa structure de page. Qui sait, il finira peut-être par produire de vrais tableaux, comme le recommande, depuis des lustres, les règles de bons usages de html et comme l'exigent les normes d'accessibilité !
Si le fichier à traiter est petit, l'outil en ligne peut suffire à réaliser le traitement. En pratique, il sert plutôt à mettre au point la feuille de style et à s'assurer que le fichier d'entrée est propre.
Pour ce type de petite transformation, un fichier volumineux pourra être facilement traité par un processeur xslt courant, par exemple xsltproc5).
La marche à suivre est simple :
$ xsltproc -o sortie.html transform.xsl source.xml
Le fichier sortie.html contiendra le résultat de la transformation.