Migrar da classe XslTransform
A arquitetura XSLT foi reprojetada na versão do Visual Studio 2005. A classe de XslTransform é substituída pela classe XslCompiledTransform.
As seções a seguir descrevem algumas das principais diferenças entre XslCompiledTransform e as classes de XslTransform .
Desempenho
A classe de XslCompiledTransform inclui muitos aprimoramentos de desempenho. O novo processador XSLT compila a folha de estilos XSLT para baixo em um formato intermediário comuns, semelhante ao que o Common Language Runtime (CLR) faz para outras linguagens de programação. Uma vez que a folha de estilos é compilada, pode ser armazenada em cachê e reutilizado.
A classe de XslCompiledTransform também inclui outras otimizações que o torna muito mais rápido que a classe de XslTransform .
Observação
Embora o desempenho geral da classe XslCompiledTransform seja melhor do que o da classe XslTransform, o método Load da classe XslCompiledTransform possivelmente apresentará um desempenho mais lento do que o método Load da classe XslTransform na primeira vez que for chamado em uma transformação. Isso ocorre porque o arquivo XSLT deve ser compilado antes que seja carregado. Para saber mais, confira a postagem de blog a seguir: XslCompiledTransform mais lento do que XslTransform?
Segurança
Por padrão, o suporte desativa da classe de XslCompiledTransform para a função XSLT document()
e script inserido. Esses recursos podem ser ativados criando um objeto de XsltSettings que possui os recursos ativados e que passa para o método de Load . O exemplo a seguir mostra como habilitar scripts e executar uma transformação XSLT.
Observação
Os blocos de script têm suporte apenas no .NET Framework. Não há suporte para eles 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 saber mais, confira Considerações sobre segurança relacionadas à reflexão.
Novos recursos
Arquivos temporários
Os arquivos temporários são gerados às vezes durante processamento XSLT. Se uma folha de estilos contém blocos de script, ou se é criada com a configuração de depuração definida para retificar, os arquivos temporários podem ser criados na pasta % temp %. Pode haver instâncias quando alguns arquivos temporários não são excluídos devido a problemas de tempo. Por exemplo, se os arquivos estão em uso por Appdomain atual ou o depurador, o finalizer do objeto de TempFileCollection não poderá removê-los.
A propriedade de TemporaryFiles pode ser usada para que a limpeza adicional certifique-se de que todos os arquivos temporários são removidos de cliente.
Suporte para o XSL: elemento e XmlWriter de saída
A classe de XslTransform ignorada configurações de xsl:output
quando a saída transformação foram enviados a um objeto de XmlWriter . A classe de XslCompiledTransform tem uma propriedade de OutputSettings que retorna um objeto de XmlWriterSettings que contém informações de saída derivada de elemento de xsl:output
folha de estilos. O objeto de XmlWriterSettings é usado para criar um objeto de XmlWriter com as configurações corretas que podem ser passada para o método de Transform . O código a seguir em c 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 classe de XslCompiledTransform pode gerar informações de depuração, que permite você depurar a folha de estilos com o Depurador do Microsoft Visual Studio. Consulte XslCompiledTransform(Boolean) para obter mais informações.
Diferenças de comportamento
Uma transformação a um XmlReader
A classe de XslTransform tiver vários transformar as sobrecargas que a transformação de retorno resultados como um objeto de XmlReader . Essas sobrecargas podem ser usadas para carregar os resultados de transformação em uma representação em memória (como XmlDocument ou XPathDocument) sem incorrer a sobrecarga de serialização e desserialização de árvore XML resultante. O código a seguir em c mostra como carregar os resultados de transformação em um objeto de XmlDocument .
// 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 classe de XslCompiledTransform não oferece suporte a XmlReader transformar um objeto. No entanto, você pode fazer algo semelhante usando o método CreateNavigator para carregar a árvore resultante XML diretamente de XmlWriter. O código a seguir em c 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 arbitrário
A recomendação de versão 1,0 do W3C de transformações XSL (XSLT) inclui as áreas no qual o provedor de implementação pode decidir como manipular uma situação. Essas áreas são consideradas como comportamento arbitrário. Há várias áreas onde XslCompiledTransform se comporta de forma diferente do que a classe de XslTransform . Para saber mais, confira Erros recuperáveis de XSLT.
Objetos de extensão e funções de script
XslCompiledTransform apresenta duas novas restrições sobre o uso de funções de script:
Somente os métodos públicos podem ser chamados de expressões XPath.
Sobrecargas são distinguíveis de se 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.
suporte deXslCompiledTransform que têm msxsl:using
e elementos filho de msxsl:assembly
dentro do elemento de msxsl:script
. Os elementos de msxsl:using
e de msxsl:assembly
são usados para declarar namespaces e assemblies adicionais para uso no bloco de script. Para saber mais, confira Blocos de script usando msxsl:script.
XslCompiledTransform proíbe os objetos de extensão que têm várias sobrecargas com o mesmo número de argumentos.
Funções de MSXML
Suporte para funções adicionais de MSXML foi adicionado à classe de XslCompiledTransform . A lista a seguir descreve a funcionalidades novas ou aprimorada:
msxsl:node-set: XslTransform exigiu que o argumento de função de node-set Function fosse um fragmento da árvore de resultado. A classe de XslCompiledTransform não tiver esse requisito.
msxsl: versão: Essa função é suportado em XslCompiledTransform.
Funções de extensão XPath: as funções ms:string-compare Function, ms:utc, ms:namespace-uri, ms:local-name, ms:number, ms:format-date e ms:format-time já têm suporte.
Funções de extensão Esquema- relacionados XPath: Essas funções não são suportadas nativamente por XslCompiledTransform. No entanto, podem ser implementados como funções de extensão.