La problématique à l'origine de cet article est la suivante : quels sont les outils (simples et visuels) existants pour déduire la feuille de transformation (XSL) nécessaire à la conversion de fichiers XML entre deux versions de schémas (XSD).
De prime abord, il existe beaucoup de logiciels sur le web répondant à ce besoin. Or il se trouve qu'aucun ne possède réellement l'ensemble des fonctionnalités désirées. Je vais donc ici compiler les petites astuces pour se munir de tout le nécessaire afin de se faciliter la vie.
La première étape est de réussir à comparer les schémas XSD pour essayer de lier les correspondances existantes entre les deux versions. Pour ce faire, le logiciel DiffDog de la société Altova, leader dans le domaine de la manipulation de fichiers XML, me semble de loin le plus simple et précis. Voici par exemple ce qu'il est capable de faire en ouvrant simplement les deux schémas :
Rien de plus aisé donc que de mapper les éléments, même dans des schémas longs et complexes, grâce à son interface accessible. Puis, à partir de cette construction, il est possible de générer le fichier XSL nécessaire à la transformation entre les deux versions.
Petit bémol cependant, comme vous pouvez le voir sur l'aperçu, DiffDog ne tient pas compte des éléments non mappés : ceux-ci n'apparaitront donc jamais dans le XSL généré... Plutôt gênant s'il s'agit d'attributs obligatoires! Dans le même principe, les contraintes spécifiées (format des données, caractère obligatoire...) ne sont pas gérées.
Il faut donc prévoir dans ce scénario de modifier à la main la feuille de transformation. Comment donc consulter le contenu du schéma de manière la plus simple possible afin de retrouver ces informations?
Le projet WTP de la fondation Eclipse dispose d'un éditeur de schémas XSD très complet permettant notamment d'en visualiser le contenu sous la forme de diagramme de classe :
Or là encore, pas moyen de visualiser rapidement l'arborescence des éléments ainsi que les contraintes... L'idéal serait une présentation sous forme de graphe. Altova propose le logiciel XMLSpy qui dispose d'une fonction de visualisation sous cette forme. Il est très complet et contient une palette d'outils très intéressante mais petit détail : il est payant...
En cherchant un peu sur le net, on peut voir qu'il existe des alternatives : WSVT, l'ancêtre de WTP. Mais là encore le bât blesse : la visualisation en graphe n'est plus disponible depuis la version 1.5 (juillet 2006 intégré dans la version 3.1 d'Eclipse!) comme l'indique ce bug!!!
Heureusement, la distribution en question est toujours téléchargeable à l'adresse suivante. Avec ceci, il est enfin possible de lire le contenu d'un schéma sous forme de graphe de manière claire, concise et complète :
Ici apparaissent bien plus explicitement les contraintes et types de relations entre les éléments.
Je ne sais pas trop pourquoi ce formalisme a été abandonné par WTP (peut-être à cause du lobbying des éditeurs de logiciels spécialisés?).
Dernier outil utile : la génération d'un XML basique à partir d'un schéma. Cette fois-ci, la dernière version de WTP contient la fonction "generate > XML file" disponible sur les fichiers XSD. Elle permet d'obtenir un fichier type répondant à l'ensemble des exigences du schéma. L'outil d'édition s'appuie ensuite sur ses spécifications pour aider la saisie du contenu :
Pour terminer, voici un petit bout de code Java permettant d'exécuter la transformation des fichiers XML :
import java.io.File;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
public class Test {
public static void main(String[] args) {
try {
File xmlFile = new File("OOB20110921007705.xml");
File xsltFile = new File("ttt.xsl");
File htmlFile = new File("result.xml");
Source xmlSource = new StreamSource(xmlFile);
Source xsltSource = new StreamSource(xsltFile);
Result xmlResult = new StreamResult(htmlFile);
TransformerFactory transFact = TransformerFactory.newInstance();
Transformer trans = transFact.newTransformer(xsltSource);
trans.transform(xmlSource, xmlResult);
} catch (TransformerException e) {
e.printStackTrace();
}
}
}
Voici donc une compilation des outils les plus simples (et si possibles gratuits) pour gérer du contenu XML. J'espère vous avoir fait économiser quelques heures de Googling!
Fichier(s) joint(s) :