Je fais actuellement joujou avec JDOM sous Java, dont je me sers pour générer un flux Atom. Le but étant que ce feed soit ensuite visible en ligne. N’importe qui ouvrant ce fichier doit ensuite pouvoir facilement le lire, soit en s’abonnant soit directement grâce à une mise en forme XSLT.
Pour ceux qui se demande ce que c’est, peut etre avez-vous deja cliqué sur un flux RSS géré par feedburner, et constaté que le document était (parfois) mis en forme dans un style propre à Feedburner? Et bien cela est fait grâce à une feuille de style XSL, qui permet de modifier l’affichage (rendu) d’une fichier XML dans le navigateur. Un peu comme on modifie le rendu d’une page XHTML avec du CSS (mais pas exactement).
Ainsi au lieu d’avoir un méchant arbre XML, on se retrouve avec une page Web classique:

Bref, étant débutant sous JDOM et en matière de génération de flux Atom, j’ai rencontré quelques obstacles, parfois bien vicieux, dont voici mes solutions:
1. Comment mettre le lien vers la feuille de style XSLT dans le document JDOM:
Pour « appeller » la feuille XSL depuis le document XML, il faut faire une déclaration dans le début du document disant ou se trouve la feuille XSL, et la déclarant comme telle. Cela ressemble à un lien vers une feuille de style CSS:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type='text/xsl' href='fichier.xsl'?>
Manuellement, aucune difficulté, mais le but était pour moi de faire cela avec JDOM puisque tout le reste du document XML est généré ainsi.
En fait il faut savoir que dans le vocable XML, l’appel à la feuille XSL est une « Processing Instruction ».
Donc dans JDOM il faut:
// Créer la processing instruction:
static ProcessingInstruction pi = new ProcessingInstruction("xml-stylesheet",
"type='text/xsl' href='fichier.xsl'");
Et l’ajouter à notre document JDOM:
//On ajoute cette PI au début du doc, après la balise xml, mais avant toutes
les autres:
document.addContent(0,pi);
2. Comment faire accepter la transformation XSLT de votre feed RSS ou ATOM par les navigateurs:
En fait, on pourrait se demander pourquoi on aurait besoin de faire cela. Si on crée une feuille XSL et qu’on la déclare on s’attend à ce qu’elle soit utilisée non? D’ailleurs tout fonctionne parfaitement en local.
Sauf que, stupeur, une fois mis en ligne, Firefox aussi bien qu’IE7, imposait leur propre affichage, donc leur propre XSL. Evidemment la première réaction est de chercher une erreur dans son propre code qui ferait qu’il ne soit pas pris en compte. J’ai bien du y perdre un après-midi, avant de tomber sur ce rapport de bug chez Mozilla:
Lorsque Firefox détecte un feed RSS ou ATOM, il impose automatiquement sa propre feuille XSL ! Inutile de préciser que les développeurs sont pour la plupart mécontents. Mais chez Mozilla ils trouvent cela normal et n’ont pas l’intention de fixer ce « problème ». D’ailleurs les autres navigateurs font la même…
L’astuce c’est de se débrouiller pour que le navigateur ne détecte pas un feed RSS ou ATOM, mais un simple fichier XML, en lui cachant les balises <feed> ou <rss>, qu’il recherche dans les 512 premiers bytes du fichier…
Pour cela il suffit d’ajouter un commentaire XML suffisamment long avant ces balises, pour les repousser hors des 512 premiers bytes. C’est radical, effet immédiat.
Articles en rapport (ou pas!) :
have you looked at vtd-xml, which is the latest and more advanced/powerful XML Processing API
vtd-xml