2009-11-16 10 views
6

Estoy usando un XsltCompiledTransform para transformar algo de XML en un fragmento de HTML (no un documento HTML completo, solo un DIV que incluiré en la página generada en otro lugar).Excluir directiva XML de XslCompiledTransform.Transform salida

que 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 transformación de siempre comienza con esta directiva XML:

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

¿Cómo evito que este aparezca en mis datos transformados?

EDIT:

que 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 aparecen en las mi salida.

Curiosamente, tanto mi origen de datos XML como mi transformación XSLT se especifican a sí mismos como UTF-8 y 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 usar 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 con la codificación.

Respuesta

14

Es necesario utilizar un objeto XmlWriterSettings. Establezca sus propiedades para omitir la declaración XML y páselo 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()); 
} 
+0

Sí, ese es el camino a seguir. No es un problema XSLT: la declaración está escrita por 'XmlWriter' en primer lugar, no por' XslCompiledTransform'. –

+0

¿Pero por qué el XmlWriter no toma su configuración del XSLT? – kristian

+1

Porque una vez que se ha creado, no puede cambiar su configuración por diseño. Entonces, una vez que XSLT lo recibe, no puede hacer nada al respecto. Si usa una sobrecarga 'Transform()' que toma un 'TextWriter' o' Stream', creará un 'XmlWriter' con la configuración correcta para usted. –

3

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

<xsl:output 
    method="html" 
    omit-xml-declaration="yes"/> 
+1

A él solo le interesa HTML, entonces yo haría method = "html" y quizás version = "somehtmlversion". – Gonzalo

+0

@Andrew - lo siento, esto no funciona. @Gonzalo - sí, eso es exactamente lo que estoy haciendo – kristian

+0

Sí, buen punto - He actualizado mi respuesta. –

Cuestiones relacionadas