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

时间:2009-11-16 02:38:47

标签: c# xml xslt xslcompiledtransform

我正在使用XsltCompiledTransform将一些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());

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

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

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

编辑:

我告诉XSLT我不希望它用

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

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

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

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

2 个答案:

答案 0 :(得分: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());
}

答案 1 :(得分:3)

最简单的方法是将此节点添加到XSLT:

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