Como: Executar uma transformação XSLT usando um assembly
Nota
Os blocos de script são suportados apenas no .NET Framework. Eles não são suportados no .NET Core ou .NET 5 ou posterior.
O compilador XSLT (xsltc.exe) compila folhas de estilo XSLT e gera um assembly. A montagem pode ser passada diretamente para o XslCompiledTransform.Load(Type) método.
Para copiar os arquivos XML e XSLT para o computador local
Copie o arquivo XSLT para o computador local e nomeie-o 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>
Copie o arquivo XML para o computador local e nomeie-o
books.xml
como .<?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>
Para compilar a folha de estilos com o script habilitado
O comando a seguir cria dois assemblies chamados Transform.dll
e Transform_Script1.dll
. Este é o comportamento predefinido. A menos que especificado de outra forma, o nome da classe e do assembly assume como padrão o nome da folha de estilos principal.
xsltc /settings:script+ Transform.xsl
O comando a seguir define explicitamente o nome da classe como Transform:
xsltc /settings:script+ /class:Transform Transform.xsl
Para incluir o assembly compilado como uma referência quando você compila seu código
Você pode incluir um assembly no Visual Studio adicionando uma referência no Gerenciador de Soluções ou na linha de comando.
Para a linha de comando com C#, use o seguinte:
csc myCode.cs /r:system.dll;system.xml.dll;Transform.dll
Para a linha de comando com o Visual Basic, use o seguinte
vbc myCode.vb /r:system.dll;system.xml.dll;Transform.dll
Para usar o assembly compilado em seu código
O exemplo a seguir mostra como executar a transformação XSLT usando a folha de estilos compilada.
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");
}
}
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
Para vincular dinamicamente ao assembly compilado, substitua
xslt.Load(typeof(Transform));
com o
xslt.Load(System.Reflection.Assembly.Load("Transform").GetType("Transform"));
Para obter mais informações sobre o Assembly.Load
método, consulte Load.