Skip to main content

XSLT Extreme

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

Popular posts from this blog

Learn Meteor book available

I'm pleased to announce the general release of my Learn Meteor book. It is now available as an ebook or print book from various sources: Learn Meteor print (paperback) on Lulu Learn Meteor ebook on LeanPub Learn Meteor ebook on Barnes & Noble Learn Meteor ebook on iBooks Learn Meteor ebook on Kobo Learn Meteor ebook on Scribd Learn Meteor ebook on Inktera Page Foundry Learn Meteor ebook on 24symbols Learn Meteor ebook on Amazon US Learn Meteor ebook on Amazon UK Learn Meteor ebook on Amazon France Learn Meteor ebook on Amazon Deutschland Learn Meteor ebook on Amazon Canada Learn Meteor ebook on Amazon India Learn Meteor ebook on Amazon Brasil Learn Meteor ebook on Amazon Mexico Learn Meteor ebook on Amazon España Learn Meteor ebook on Amazon Italia Learn Meteor ebook on Amazon Netherlands Learn Meteor ebook on Amazon Japan Learn Meteor ebook on Amazon Australia More sources are coming soon for the print version. Learn Meteor has been a fun experienc