最近同事手裡的一個項目需要用 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);