6

我正在使用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-8not UTF-16

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

4

2 回答 2

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());
}
于 2009-11-16T06:41:49.320 回答
3

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

<xsl:output 
    method="html" 
    omit-xml-declaration="yes"/>
于 2009-11-16T02:45:09.990 回答