Excluir directiva XML de salida XslCompiledTransform.Transform
-
20-09-2019 - |
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.
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"/>