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.

Foi útil?

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"/>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top