最近同事手里的一个项目需要用 XSLT + XML 输出 Microsoft Word 格式的 Doc文件。考虑到客户机器上安装的不一定是支持 WordML Office 2003, 所以XSLT + XML输出 WordML 的方案被剔除。此外商业的转换组件价格不菲,似乎也不行。还有就是转换成 RTF 格式,看上去也不容易。因为要输出的东西很简单,只有几个表格和文字,没有复杂的东西,最后采用了 XSLT + XML 输出 HTML 文件的方法,HTML 改扩展名为 doc,用 Word 打开,没有问题,看来这个办法是可行的。

XML 数据里面包含了 <br /> 这个 html 元素, 但是用 C# 进行 XsltTransform 死活就是输出不了 <br />。奇怪的是IE 直接浏览 XML 文件和 Javascript 调用 MSXML 得到的转换结果却是正常的 - <br /> 可以正常的显示出来。文件是这样写的(部分)

XML

<root>
   
<a><![CDATA[AAAAAA <br /> BBBBBB<br />CCCCCC]]></a>
</root>


XSLT:

<xsl:value-of disable-output-escaping="yes" select="/root/a"/>


Javascript

    var xml = new ActiveXObject("Msxml2.DOMDocument.4.0");
 xml.load(
"a.xml"); 
    var xslt = new ActiveXObject("Msxml2.DOMDocument.4.0");
 xslt.load(
"a.xslt");
 document.write(xml.transformNode(xslt));


C#
  

            XslTransform xslt = new XslTransform();
            XmlDocument xml 
= new XmlDocument();
            xslt.Load(
"a.xslt");
            xml.Load((
"a.xml"));
            
using (XmlTextWriter writer = new XmlTextWriter("a.doc", Encoding.Default))
            
{
                xslt.Transform(xml, 
null, writer, null);
                writer.Close();
            }

 

就是上面的这些代码,用浏览器直接看 xml 文件和 javascript 都是正常的输出的结果,就像事先设想的那样:

AAAAAA 
BBBBBB
CCCCCC 

但是 C# 那个版本的就是输出不了 <br />, 结果是这样的:

AAAAAABBBBBBCCCCCC 


Google 半天找到原来是这样样子的 XmlWriter XmlReader 将忽略 XSLT 中的 disable-output-escaping 这个选项(详情参考 http://www.dotnet247.com/247reference/msgs/28/142194.aspx)。将上述 C# 代码中的 XmlTextWriter 换成 FileStream 一切搞定。

System.IO.Stream strmTemp = new System.IO.FileStream("a.doc", System.IO.FileMode.Create, System.IO.FileAccess.ReadWrite);

 

 posted on 2004-11-25 14:23  一切由.NET开始  阅读(5347)  评论(4编辑  收藏  举报