Dernière session en direct de ce TechEd 2007 à Barcelone, "XSLT Extreme" par Dave McMahon. Il s'agit encore une fois de mes notes non retraitées, brutes de fonderie. Mais vous savez... Il s'agit d'une session pour ceux qui connaissent XSLT 1.0, XPath 1.0 et le .NET Framework. Accrochez-vous, nous allons secouer XSLT pour en faire de nombreuses choses!
Pourquoi XSLT?
Pour:
- avoir un design propre, en séparant le contenu et l'apparence
- simplifier le développement, notamment les transformations de données XML
- simplifier le déploiement, car on peut travailler par simple copie avec XSLT
- simplifier la maintenance et les mises à jour
Scénarios:
- B2B: par exemple BizTalk
- Sites Web pour avoir une architecture très légère
- Sites Web sans base de données (par exemple pour réduire les coûts d'hébergement)
- Liaison entre pages XAML simple et des données
Le langage
Il est
- compact: 18 à 20 éléments dans la V1.0 seulement.
- déclaratif, et c'est la mode en ce moment (WPF, WCF, XSL).
- fonctionnel, du même genre que F# (bien qu'XSLT soit domain-specific).
- extensible, et c'est ce que nous allons voir dans cette session.
XSLT dans le Framework 2.0
- XslCompiledTransform: mieux que XslTransform du 1.0 en termes de performance
- XsltArgumentList: permet de passer des paramètres lors d'une transformation de document et aussi d'étendre le langage
- XsltSettings: plutôt pour la sécurité
- XmlUrlResolver/XmlSecureResolver: permet de trouver les références aux documents externes
Premiers pas
Il n'est pas besoin de donner un template. En plaçant simplement <xsl:output>, le template par défaut est appliqué.
En ajoutant un template pour un élément, l'élément n'est plus traité par le template par défaut. Si notre template est vide, l'élément concerné n'apparaît plus.
En mettant un template vide sur "/" on bloque le template par défaut, ce qui évite de récupérer des "leftovers" que l'on aurait oublié.
<xsl:call-template> permet d'avoir une sorte d'include.
<xsl:apply-templates> permet d'appliquer les autres templates à partir du point où il est placé.
Note: avec Visual Studio 2005, on peut mettre une point d'arrêt dans le XSL, et le débogueur passe dans le XSL plus le XML!
Fournir autre chose que du XML en entrée du XSLT
Rien n'oblige à ce que l'entrée soit du XML. XSLT décrit en fait ce qu'on peut récupérer par des expressions XPath. Ce qui en .NET peut être toute chose qui implémente IXPathNavigable. Par exemple du CSV ou même un système de fichiers.
IXPathNavigable représente en fait un curseur, avec des instructions MoveToNext, MoveToPrevious.
Traitement
Scripting
Par exemple pour calculer la moyenne de plusieurs éléments (il n'y a pas de fonction pour calculer la moyenne en XSLT).
Pour cela, on:
- utilise un XsltSettings, que l'on passe au Load du XslTransform.
- ajoute un script dans le XSLT (en JavaScript, C#, VB, ...)
- utilise l'élément <xsl:variable> puis la fonction XSLT FormatValue
- Pour les nombres, il faut ajouter xsl:decimal-format
Conseil: mieux vaut faire des choses simples avec le scripting.
Sources multiples
- avec <xsl:variable> on stocke une référence vers le document XML à inclure.
- un <xsl:value-of> peut référencer la "variable" avec un select="$nom-variable/chemin".
Utiliser les événements
XSLT est assez difficile à déboguer. Message peut aider.
On utilise le <xsl:message>, qui envoie la sortie au processeur.
Sur XsltArgument on a un événement XsltMessageEncountered qui est appelé à chaque fois que l'élement <xsl:message> est atteint. Ce qui nous permet de récupérer le message pour le tracer et donc aider le débogage.
Extension du XSLT avec du code managé
Il suffit d'ajouter n'importe quelle classe .NET (pas d'interface à implémenter) et de l'ajouter en appelant la méthode AddExtensionObject aux XsltSettings et en fournissant un espace de nommage pour cette extension.
Sortie
On peut facilement sortir du XML, par exemple un flux RSS.
Faire sortir du CSV est tout aussi simple.
Pour faire sortir du Word, on peut par exemple produire du RTF. Mais on peut produire du WordML, ce qui fonctionne à partir de Word 2003. Pour ne pas transpirer dans la création du WordML, on peut simplement créer un document sous Word et le sauver en WordML, pour récupérer la base de notre XSLT.
Pour finir, on peut bien entendu produire du XAML. Dave McMahon nous montre dans une démonstration comment produire une interface en XAML (ici une ListView affichant les données sous forme d'un tableau). Grâce au XmlDataProvider, on peut binder les contrôles XAML au XML qui est fourni au XSLT.
Comments