Procédure : effectuer une transformation XSLT à l'aide d'un assembly
Mise à jour : November 2007
Le compilateur XSLT (xsltc.exe) compile des feuilles de style XSLT et génère un assembly. L'assembly peut être passé directement dans la méthode XslCompiledTransform.Load(Type).
Pour copier les fichiers XML et XSLT sur votre ordinateur local
Copiez le fichier XSLT sur votre ordinateur local et nommez-le Transform.xsl.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:user="urn:my-scripts"> <msxsl:script language="C#" implements-prefix="user"> <![CDATA[ public string discount(string price){ char[] trimChars = { '$' }; //trim leading $, convert price to type double double discount_value = Convert.ToDouble(price.TrimStart(trimChars)); //apply 10% discount and round appropriately discount_value = .9*discount_value; //convert value to decimal and format as currency string discount_price = discount_value.ToString("C"); return discount_price; } ]]> </msxsl:script> <xsl:template match="catalog"> <html> <head></head> <body> <table border="1"> <tr> <th align="left">Title</th> <th align="left">Author</th> <th align="left">Genre</th> <th align="left">Publish Date</th> <th align="left">Price</th> </tr> <xsl:for-each select="book"> <tr> <td> <xsl:value-of select="title"/> </td> <td> <xsl:value-of select="author"/> </td> <td> <xsl:value-of select="genre"/> </td> <td> <xsl:value-of select="publish_date"/> </td> <xsl:choose> <xsl:when test="genre = 'Fantasy'"> <td> <xsl:value-of select="user:discount(price)"/> </td> </xsl:when> <xsl:otherwise> <td> <xsl:value-of select="price"/> </td> </xsl:otherwise> </xsl:choose> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
Copiez le fichier XML sur votre ordinateur local et nommez-le books.xml.
<?xml version="1.0"?> <catalog> <book id="bk101"> <author>Gambardella, Matthew</author> <title>XML Developer's Guide</title> <genre>Computer</genre> <price>$44.95</price> <publish_date>2000-10-01</publish_date> </book> <book id="bk102"> <author>Ralls, Kim</author> <title>Midnight Rain</title> <genre>Fantasy</genre> <price>$5.95</price> <publish_date>2000-12-16</publish_date> </book> <book id="bk103"> <author>Corets, Eva</author> <title>Maeve Ascendant</title> <genre>Fantasy</genre> <price>$5.95</price> <publish_date>2000-11-17</publish_date> </book> <book id="bk106"> <author>Randall, Cynthia</author> <title>Lover Birds</title> <genre>Romance</genre> <price>$4.95</price> <publish_date>2000-09-02</publish_date> </book> <book id="bk107"> <author>Thurman, Paula</author> <title>Splish Splash</title> <genre>Romance</genre> <price>$4.95</price> <publish_date>2000-11-02</publish_date> </book> </catalog>
Pour compiler la feuille de style avec le script activé.
L'exécution de la commande suivante depuis la ligne de commande crée deux assemblys nommés Transform.dll et Transform_Script1.dll (C'est le comportement par défaut. Sauf spécification contraire, le nom de la classe et de l'assembly est par défaut celui de la feuille de style principale) :
xsltc /settings:script+ Transform.xsl
La commande suivante donne explicitement à la classe le nom Transform :
xsltc /settings:script+ /class:Transform Transform.xsl
Pour inclure l'assembly compilé comme référence lorsque vous compilez votre code.
Vous pouvez inclure un assembly dans Visual Studio en ajoutant une référence dans l'Explorateur de solutions ou à partir de la ligne de commande.
Pour la ligne de commande en C#, utilisez la syntaxe suivante :
csc myCode.cs /r:system.dll;system.xml.dll;Transform.dll
Pour la ligne de commande en Visual Basic, utilisez la syntaxe suivante :
vbc myCode.vb /r:system.dll;system.xml.dll;Transform.dll
Pour utiliser l'assembly compilé dans votre code.
- L'exemple suivant montre comment exécuter la transformation XSLT à l'aide de la feuille de style compilée.
Imports System
Imports System.Xml.Xsl
Module Module1
Sub Main()
'Create a new XslCompiledTransform and load the compiled transformation.
Dim xslt As New XslCompiledTransform()
xslt.Load(GetType(Transform))
'Execute the transform and output the results to a file.
xslt.Transform("books.xml", "discount_books.html")
End Sub
End Module
using System;
using System.Xml.Xsl;
class Example
{
static void Main()
{
//Create a new XslCompiledTransform and load the compiled transformation.
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load(typeof(Transform));
// Execute the transformation and output the results to a file.
xslt.Transform("books.xml", "discount_books.html");
}
}
Pour établir de manière dynamique une liaison avec l'assembly compilé, remplacez
xslt.Load(typeof(Transform))
par
xslt.Load(System.Reflection.Assembly.Load("Transform").GetType("Transform"))
dans l'exemple ci-dessus. Pour plus d'informations sur la méthode Assembly.Load, voir Load.
Voir aussi
Concepts
Génération à partir de la ligne de commande