从XslCompiledTransform.Transform输出中排除XML指令

kri*_*ian 6 c# xml xslt xslcompiledtransform

我正在使用一个XsltCompiledTransformXML将一些XML转换为HTML片段(不是一个完整的HTML文档,只是我将在其他地方生成的页面中包含的DIV).

我正在进行如下转换:

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());
Run Code Online (Sandbox Code Playgroud)

我的问题是转换的结果总是从这个XML指令开始:

<?xml version="1.0" encoding="utf-16"?>
Run Code Online (Sandbox Code Playgroud)

如何防止这种情况出现在我的转化数据中?

编辑:

我告诉XSLT我不希望它输出一个xml声明

<xsl:output method="html" version="4.0" omit-xml-declaration="yes"/>
Run Code Online (Sandbox Code Playgroud)

但这似乎对我的输出中出现的指令没有影响.

有趣的是,我的XML数据源和我的XSLT转换都指定自己UTF-8不是UTF-16.

更新: UTF-16似乎正在出现,因为我使用字符串(构建器)作为输出机制.当我将代码更改为使用MemoryStream而不是a时StringBuilder,我的UTF-8编码将被保留.我猜这与该string类型的内部工作方式以及它如何处理编码有关.

kri*_*ian 14

你需要使用一个XmlWriterSettings对象.设置其属性以省略XML声明,并将其传递给您的构造函数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());
}
Run Code Online (Sandbox Code Playgroud)