我有以下代码:
using (Stream stream = new MemoryStream())
{
xslt.Transform(document, xslArg, stream);
stream.Seek(0, SeekOrigin.Begin);
StreamReader reader = new StreamReader(stream);
var result = reader.ReadToEnd();
return result;
}
该转换输出HTML文档。令我感到困惑的是,即使输入xsl包含:
<html>
<head>
<style>
@page Section1
{size:612.0pt 792.0pt;
margin:42.55pt 42.55pt 42.55pt 70.9pt;
mso-header-margin:35.45pt;
mso-footer-margin:35.45pt;
mso-paper-source:0;}
div.Section1
{page:Section1;}
</head>
<body>
<div class="Section1">
.....
输出是:
<html xmlns:ms="urn:schemas-microsoft-com:xslt" xmlns:dt="urn:schemas-microsoft-com:datatypes">
<head>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
<style>.....
如你所见,除了其他内容之外,还添加了charset信息。
但真正让我感到惊讶的是,当我改变代码转换成:
StringBuilder sb = new StringBuilder();
using (StringWriter writer = new StringWriter(sb))
{
xslt.Transform(document, xslArg, writer);
}
var result = sb.ToString();
return result;
生成的输出具有以下形式:
<html xmlns:ms="urn:schemas-microsoft-com:xslt" xmlns:dt="urn:schemas-microsoft-com:datatypes">
<head>
<META http-equiv="Content-Type" content="text/html; charset=utf-16">
<style>....
正如你所看到的,charset已经改变了。我想这是因为StringBuilder和.NET默认使用UTF-16进行操作。但是,为什么转换会将META标记添加到charset呢?
答案 0 :(得分:4)
您的样式表是<xsl:output method="html"/>
还是结果树的根元素具有本地名称html
并且没有名称空间。在这两种情况下,XSLT规范都要求XSLT处理器在序列化结果树时在head部分中添加一个包含内容类型和字符集的元元素。