Exclude XML directive from XslCompiledTransform.Transform output

5.9k Views Asked by At

I'm using an XsltCompiledTransform to transform some XML into a fragment of HTML (not a complete HTML document, just a DIV that I will include in page generated elsewhere).

I'm doing the transformation as follows:

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

My problem is that the result of the transform always begins with this XML directive:

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

How do I prevent this from appearing in my transformed data?

EDIT:

I'm telling the XSLT that I don't want it to output an xml declaration with

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

but this seems to have no effect on the directive appearing in my output.

Interestingly, both my XML data source and my XSLT transform specify themselves as UTF-8 not UTF-16.

UPDATE: The UTF-16 seems to be appearing because I'm using a string(builder) as an output mechanism. When I change the code to use a MemoryStream instead of a StringBuilder, my UTF-8 encoding is preserved. I'm guessing this has something to do with the internal workings of the string type and how it deals with encoding.

2

There are 2 best solutions below

5
On BEST ANSWER

You need to use an XmlWriterSettings object. Set its properties to omit the XML declaration, and pass it to the constructor of your 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());
}
2
On

The easiest way would be to add this node to your XSLT:

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