Exclua a diretiva XML da saída xslCompiledtransform.Transform Output
-
20-09-2019 - |
Pergunta
Estou usando um XsltCompiledTransform
Para transformar algum XML em um fragmento de HTML (não é um documento HTML completo, apenas uma div que incluirei na página gerada em outros lugares).
Estou fazendo a transformação da seguinte maneira:
StringBuilder output = new StringBuilder();
XmlReader rawData = BusinessObject.GetXml();
XmlWriter transformedData = XmlWriter.Create(output);
XslCompiledTransform transform = new XslCompiledTransform();
transform.Load("stylesheet.xslt");
transform.Transform(rawData, transformedData);
Response.Write(output.ToString());
Meu problema é que o resultado da transformação sempre começa com esta diretiva XML:
<?xml version="1.0" encoding="utf-16"?>
Como evito que isso apareça nos meus dados transformados?
EDITAR:
Estou dizendo ao XSLT que não quero que seja produzido uma declaração XML
<xsl:output method="html" version="4.0" omit-xml-declaration="yes"/>
Mas isso parece não ter efeito na diretiva que aparece na minha saída.
Curiosamente, tanto minha fonte de dados XML quanto minha transformação XSLT especificam -se como UTF-8
não UTF-16
.
ATUALIZAR:O UTF-16 parece estar aparecendo porque estou usando uma string (construtora) como um mecanismo de saída. Quando eu mudei o código para usar um MemoryStream
em vez de um StringBuilder
, minha codificação UTF-8 é preservada. Acho que isso tem algo a ver com o funcionamento interno do string
Digite e como ele lida com a codificação.
Solução
Você precisa usar um XmlWriterSettings
objeto. Defina suas propriedades para omitir a declaração XML e passar para o construtor de seu XmlWriter
.
StringBuilder output = new StringBuilder();
XmlReader rawData = BusinessObject.GetXml();
XmlWriterSettings writerSettings = new XmlWriterSettings();
writerSettings.OmitXmlDeclaration = true;
using (XmlWriter transformedData = XmlWriter.Create(output, writerSettings))
{
XslCompiledTransform transform = new XslCompiledTransform();
transform.Load("stylesheet.xslt");
transform.Transform(data, transformedData);
Response.Write(output.ToString());
}
Outras dicas
A maneira mais fácil seria adicionar este nó ao seu XSLT:
<xsl:output
method="html"
omit-xml-declaration="yes"/>