C# 处理XML + XSLT转换中HTML元素的输出问题及解决

最近同事手里的一个项目需要用 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

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

<?xml:namespace prefix = o />


XSLT:

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


Javascript

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


C#
 

 

None.gif             XslTransform xslt  =   new  XslTransform();
None.gif            XmlDocument xml 
=   new  XmlDocument();
None.gif            xslt.Load(
" a.xslt " );
None.gif            xml.Load((
" a.xml " ));
None.gif            
using  (XmlTextWriter writer  =   new  XmlTextWriter( " a.doc " , Encoding.Default))
ExpandedBlockStart.gifContractedBlock.gif            
dot.gif {
InBlock.gif                xslt.Transform(xml, 
null, writer, null);
InBlock.gif                writer.Close();
ExpandedBlockEnd.gif            }

 

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

None.gif AAAAAA 
None.gifBBBBBB
None.gifCCCCCC None.gif

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

None.gif AAAAAABBBBBBCCCCCC None.gif


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

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

 

转载于:https://www.cnblogs.com/zhumi/archive/2004/11/25/68599.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值