Pregunta

Estoy usando un XsltCompiledTransform para transformar algunos XML en un fragmento de HTML (no un documento HTML completo, sólo un DIV que voy a incluir en la página generada en otro lugar).

Me estoy haciendo la transformación de la siguiente manera:

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());

Mi problema es que el resultado de la siempre transformar comienza con esta directiva XML:

<?xml version="1.0" encoding="utf-16"?>

¿Cómo puedo evitar que esto aparece en mis datos transformados?

EDIT:

Estoy diciendo la XSLT que no quiero que para emitir una declaración XML con

<xsl:output method="html" version="4.0" omit-xml-declaration="yes"/>

pero esto parece no tener efecto sobre la directiva que aparece en mi salida.

Curiosamente, tanto mi fuente de datos XML y XSLT mi transforman a sí mismos como especifica UTF-8 no UTF-16.

ACTUALIZACIÓN: El UTF-16 parece estar apareciendo porque estoy usando una cadena (constructor), como un mecanismo de salida. Cuando cambio el código para utilizar un MemoryStream en lugar de un StringBuilder, se conserva mi codificación UTF-8. Supongo que esto tiene algo que ver con el funcionamiento interno del tipo string y cómo se trata de codificación.

¿Fue útil?

Solución

Es necesario utilizar un objeto XmlWriterSettings. Establecer sus propiedades omitir la declaración XML, y pasarlo al constructor de su 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());
}

Otros consejos

La forma más fácil sería añadir este nodo para su XSLT:

<xsl:output 
    method="html" 
    omit-xml-declaration="yes"/>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top