日期:2010-07-23  浏览次数:21204 次

  Xslt文件编写学会以后,在真正的应用中,我还需要利用转换引擎,进行文件的转换。Xslt转换,一般来说分为服务器端转换和客户端转换。服务器端转换,也就是说用asp/jsp代码进行Xslt转换,这样发给用户客户端的是格式化好的Html文件(在Atom2Rss里面是Xml文件。)。客户端转换,是直接发给用户客户端Xml文件,由客户端进行转换,这样就需要客户端支持Xml标准。目前真正完整支持Xml标准的Ie6,Mozilla,而目前还有很多用户还在使用Ie5,甚至是Ie4,或者是其他的不支持Xml的浏览器。所以,在很多时候,我们需要进行服务器端的转换。

  程序代码很简单,下面代码来自Msdn,被我由Vb Script代码改成了Asp代码:

Dim xslt,xslDoc,xmlDoc,xslProc
Set xslt=Server.CreateObject("Msxml2.XSLTemplate")
Set xslDoc=Server.CreateObject("Msxml2.FreeThreadedDOMDocument")
Set xmlDoc=Server.CreateObject("Msxml2.DOMDocument")
Set xslProc=Server.CreateObject("IXSLProcessor")
xslDoc.async = False
xslDoc.resolveExternals = False
xslDoc.load "sample.xsl"
Set xslt.stylesheet = xslDoc
xmlDoc.async = False
xmlDoc.resolveExternals = False
xmlDoc.load "books.xml"
Set xslProc = xslt.createProcessor()
xslProc.input = xmlDoc
xslProc.addParameter "param1", "Hello"
xslProc.Transform
Response.write xslProc.output

  这个代码很简单也很容易看懂,但是在我真正应用的时候发现一个很痛苦的问题,就是我的Xml文件编码是GB2312,我的Xslt文件编码是GB2312,而且在Xslt里面也设定了输出的Xml文件的编码是GB2312,但是生成的文件的编码却是UTF-16。这样就造成了我的文件编码错误,在IE里面没有办法阅读。

  我在网上搜索这个问题,发现这个问题相当普遍,找到了一个讲得比较清楚的文章RE: [xsl] Problem with Chinese (Solution)。
  
  文章的大概意思是:如果你需要生成指定编码的文档,你就不要在代码中使用String。因为在Win32平台里面String的编码总是Utf-16,所以你不能期望MSXML能够输出GB2312的String。如果利用流的方式Load,transformNodeToObject来进行处理,就可以避免这个问题。

  根据这个思路做出来的程序如下:

dim xsldoc,xmldoc,xmlfile,xslfile
xmlfile="test.xml"
xslfile="test.xsl"
'生成xml转换所需要的对象
set xslDoc = server.CreateObject("MSXML2.FreeThreadedDOMDocument")
set xmlDoc =server.CreateObject("MSXML2.DOMDocument")
'装入xsl文件
xsldoc.async=False
xsldoc.resolveExternals =False
xsldoc.load server.MapPath(xslfile)
'装入xml文件
xmldoc.async=False
xmldoc.resolveExternals =False
xmldoc.load server.MapPath(xmlfile)
xmldoc.transformNodeToObject xsldoc,Response
'进行转换
'清楚所有内存
set xslt=nothing
set xsldoc=nothing
set xmldoc=nothing

至此,问题完全得到解决。