2011-05-20 39 views
3

我已经下面的代码段:.NET的XslTransform神秘 - 在转换输出META字符集

 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>..... 

正如你看到的,字符集信息加入,从其他的东西分开。

但真正让我吃惊,是,当我改变了代码,使转变为:

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>.... 

正如你所看到的,字符集已经改变。我想这是因为StringBuilder和.NET默认情况下使用UTF-16。但是,为什么转换将META标签与charset附加在一起呢?

回答

4

那么或者你的样式表有<xsl:output method="html"/>或者结果树的根元素的本地名称为html,并且没有名称空间。在这两种情况下,XSLT规范都要求XSLT处理器在序列化结果树时在头部分添加一个带有内容类型和字符集的元素。