XSLT for the dummies
Monday, October 9th, 2006Je ne sais pas si je suis victime du syndrome “quand tu as un marteau en main, au bout d’un moment tout ressemble à un clou”, mais en tout cas après StringTemplate la semaine dernière je m’adonne cette semaine aux joies de XSLT, un autre langage de définition de templates. Mon problème était de fournir un moyen générique à nos clients pour intégrer des fichiers XML dans notre produit. La solution évidente à ce problème est d’intégrer un moteur de transformation dans notre produit avec comme format de sortie notre format d’intégration existant (CSV).
Vu que nous utilisons déjà MSXML 4.0+ pour d’autres tâches, il était facile d’ajouter un point d’entrée vers cette API dans le module d’importation. C’est là que mon Program Manager me demande si on pouvait intégrer un mode “dummy” qui permet de générer un script XSLT à partir d’instructions de mapping simples. En effet, certaines personnes du support pourraient être rebutées par la syntaxe chevelue de XSLT. Il faut donc proposer une alternative simple à leurs pauvres cerveaux sursaturés. Certes, il nous faut donc quelque chose pour générer du XSLT. Euh, pourquoi ne pas utiliser XSLT lui-même? Et voilà! Le tag xsl:namespace-alias est exactement ce qu’il faut dans ces cas là, sans oublier xsl:comment qui permet de générer des commentaires dans le XML de sortie. Voici un extrait de mon générateur de XSLT (c’est vrai que la syntaxe est vraiment laide!):
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xso="http://www.intelligo.ie/2006/XSLT/Generation"
exclude-result-prefixes="xs"
xmlns="http://www.w3.org/1999/xhtml"
>
<!--
Générateur de XSLT
-->
<xsl:output method="xml" encoding="iso-8859-1"
indent="yes" version="1.0"/>
<!--On utilise l'alias xso quand on a besoin
de générer des tags XSLT -->
<xsl:namespace-alias stylesheet-prefix="xso"
result-prefix="xsl"/>
<!-- Template racine -->
<xsl:template match="/">
<xsl:apply-templates name="/tupleGen" />
</xsl:template>
<xsl:template match="tupleGen">
<xso:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
xmlns="http://www.w3.org/1999/xhtml">
<xsl:comment>** Generated on:
<xsl:value-of select="@date" /> **</xsl:comment>
<xso:output method="text"
encoding="iso-8859-1" indent="no"/>
<xsl:comment> This is the root template </xsl:comment>
<xso:template match="/">
[etc.]
</xso:template>
</xso:stylesheet>
</xsl:template>
</xsl:stylesheet>