我使用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"?>

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

修改

我要告诉我不希望它的输出以XML声明的XSLT

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

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

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

<强>更新 在UTF-16似乎是因为我使用的字符串(制造商)作为输出机制出现。当我修改代码以使用MemoryStream代替StringBuilder的,我的UTF-8编码被保留。我猜这事做与string类型,以及如何将其与编码涉及的内部工作。

有帮助吗?

解决方案

您需要使用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());
}

其他提示

最简单的方法将这个节点添加到您的XSLT:

<xsl:output 
    method="html" 
    omit-xml-declaration="yes"/>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top