Compartilhar via


Migrando da classe XslTransform

A arquitetura XSLT foi reprojetada na versão do Visual Studio 2005. A XslTransform classe foi substituída pela XslCompiledTransform classe.

As seções a seguir descrevem algumas das principais diferenças entre as classes XslCompiledTransform e XslTransform.

Desempenho

A XslCompiledTransform classe inclui muitas melhorias de desempenho. O novo processador XSLT compila a folha de estilos XSLT até um formato intermediário comum, semelhante ao que o CLR (Common Language Runtime) faz para outras linguagens de programação. Depois que a folha de estilos for compilada, ela poderá ser armazenada em memória cache e reutilizada.

A XslCompiledTransform classe também inclui outras otimizações que a tornam muito mais rápida do que a XslTransform classe.

Observação

Embora o desempenho geral da XslCompiledTransform classe seja melhor que a XslTransform classe, o Load método da XslCompiledTransform classe pode ter um desempenho mais lento do que o Load método da XslTransform classe na primeira vez em que é chamado em uma transformação. Isso ocorre porque o arquivo XSLT deve ser compilado antes de ser carregado. Para obter mais informações, consulte a seguinte postagem no blog: XslCompiledTransform Mais lento que XslTransform?

Segurança

Por padrão, a XslCompiledTransform classe desabilita o suporte para a função XSLT document() e o script inserido. Esses recursos podem ser habilitados criando um XsltSettings objeto que tem os recursos habilitados e passando-os para o Load método. O exemplo a seguir mostra como habilitar o script e executar uma transformação XSLT.

Observação

Os blocos de script têm suporte apenas no .NET Framework. Eles não têm suporte no .NET Core ou no .NET 5 ou posterior.

// Create the XsltSettings object with script enabled.
XsltSettings settings = new XsltSettings(false,true);

// Execute the transform.
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load("calc.xsl", settings, new XmlUrlResolver());
xslt.Transform("books.xml", "books.html");
' Create the XsltSettings object with script enabled.
Dim settings As New XsltSettings(False, True)

' Execute the transform.
Dim xslt As New XslCompiledTransform()
xslt.Load("calc.xsl", settings, New XmlUrlResolver())
xslt.Transform("books.xml", "books.html")

Para obter mais informações, consulte considerações de segurança XSLT.

Novos recursos

Arquivos temporários

Às vezes, os arquivos temporários são gerados durante o processamento XSLT. Se uma folha de estilos contiver blocos de script ou se for compilada com a configuração de depuração definida como true, os arquivos temporários poderão ser criados na pasta %TEMP%. Pode haver instâncias em que alguns arquivos temporários não são excluídos devido a problemas de tempo. Por exemplo, se os arquivos estiverem em uso pelo AppDomain atual ou pelo depurador, o finalizador do TempFileCollection objeto não poderá removê-los.

A TemporaryFiles propriedade pode ser usada para limpeza adicional para garantir que todos os arquivos temporários sejam removidos do cliente.

Suporte para o elemento xsl:output e o XmlWriter

A XslTransform classe ignorou xsl:output as configurações quando a saída de transformação foi enviada para um XmlWriter objeto. A XslCompiledTransform classe tem uma OutputSettings propriedade que retorna um XmlWriterSettings objeto que contém as informações de saída derivadas do xsl:output elemento da folha de estilos. O XmlWriterSettings objeto é usado para criar um XmlWriter objeto com as configurações corretas que podem ser passadas para o Transform método. O código C# a seguir ilustra esse comportamento:

// Create the XslTransform object and load the style sheet.
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load(stylesheet);

// Load the file to transform.
XPathDocument doc = new XPathDocument(filename);

// Create the writer.
XmlWriter writer = XmlWriter.Create(Console.Out, xslt.OutputSettings);

// Transform the file and send the output to the console.
xslt.Transform(doc, writer);
writer.Close();

Opção de depuração

A XslCompiledTransform classe pode gerar informações de depuração, o que permite depurar a folha de estilos com o Depurador do Microsoft Visual Studio. Consulte XslCompiledTransform(Boolean) para obter mais informações.

Diferenças comportamentais

Uma transformação a um XmlReader

A XslTransform classe tem várias sobrecargas de transformação que retornam resultados de transformação como um XmlReader objeto. Essas sobrecargas podem ser usadas para carregar os resultados da transformação em uma representação na memória (como XmlDocument ou XPathDocument) sem incorrer na sobrecarga de serialização e desserialização da árvore XML resultante. O código C# a seguir mostra como carregar os resultados da transformação em um XmlDocument objeto.

// Load the style sheet
XslTransform xslt = new XslTransform();
xslt.Load("MyStylesheet.xsl");

// Transform input document to XmlDocument for additional processing
XmlDocument doc = new XmlDocument();
doc.Load(xslt.Transform(input, (XsltArgumentList)null));

A XslCompiledTransform classe não dá suporte à transformação em um XmlReader objeto. No entanto, você pode fazer algo semelhante usando o CreateNavigator método para carregar a árvore XML resultante diretamente de um XmlWriter. O código C# a seguir mostra como realizar a mesma tarefa usando XslCompiledTransform.

// Transform input document to XmlDocument for additional processing
XmlDocument doc = new XmlDocument();
using (XmlWriter writer = doc.CreateNavigator().AppendChild()) {
    xslt.Transform(input, (XsltArgumentList)null, writer);
}

Comportamento discricionário

A recomendação do W3C XSL Transformations (XSLT) versão 1.0 inclui áreas nas quais o provedor de implementação pode decidir como lidar com uma situação. Essas áreas são consideradas comportamentos discricionários. Há várias áreas em que o XslCompiledTransform comportamento é diferente da XslTransform classe. Para obter mais informações, consulte Erros XSLT recuperáveis.

Objetos de extensão e funções de script

XslCompiledTransform apresenta duas novas restrições sobre o uso de funções de script:

  • Somente métodos públicos podem ser chamados a partir de expressões XPath.

  • As sobrecargas são distinguíveis umas das outras com base no número de argumentos. Se mais de uma sobrecarga tem o mesmo número de argumentos, uma exceção será lançada.

Em XslCompiledTransform, uma associação (pesquisa do nome do método) às funções de script ocorre em tempo de compilação, e as folhas de estilos que trabalharam com XslTransform podem causar uma exceção quando são carregadas com XslCompiledTransform.

XslCompiledTransform dá suporte a ter os elementos filho msxsl:using e msxsl:assembly dentro do elemento msxsl:script. Os elementos msxsl:using e msxsl:assembly são usados para declarar namespaces e assemblies adicionais para uso no bloco de script. Consulte Blocos de Script usando msxsl:script para obter mais informações.

XslCompiledTransform proíbe objetos de extensão que têm várias sobrecargas com o mesmo número de argumentos.

Funções MSXML

O suporte para funções MSXML adicionais foi adicionado à XslCompiledTransform classe. A lista a seguir descreve a funcionalidade nova ou aprimorada:

Consulte também