XML文件形式:
[...]
XSLT文件形式(内容部分省略):
我开始进行的转换代码,用的是ASP+JavaScirpt:
//========输出类型和流编码==========================
Response.ContentType="application/vnd.google-earth.kml+xml";
Response.CharSet="UTF-8";
//=====获得并载入远程XML文件==========================
varoXHy=Server.CreateObject("MSXML2.XMLHTTP");
varurl=http://www.dnxh.cn/ge/CHXX0101.xml;
oXHy.open("GET",url,false);
oXHy.send();
varoXD=Server.CreateObject("MSXML2.DOMDocument");
oXD.loadXML(oXHy.responseText);
//======载入XSL文件=========================
varxsl=Server.CreateObject("Microsoft.XMLDOM");
xsl.async=false;
xsl.load(Server.MapPath("gew.xsl"));
//======文件的转换====================
Response.Write(oXD.transformNode(xsl));
按理说这样应该没有编码的问题了,因为该声明编码的地方都声明了。可是偏偏出了问题。输出的KML文件的开头声明里面总是
通过测试发现XML和XSLT两个源文件没有问题,那问题就在ASP代码里的转换引擎上,后来在RE:[xsl]ProblemwithChinese(Solution)这篇文章上大概的找到了原因,这里面说引擎transformNode是生成了一个字符串,而在win32平台上总是以UTF-16来处理字符串的,然后我们再用这个字符串来生成KML文件,那结果就只能是UTF-16的了。
解决的办法就是用transformNodeToObject引擎。文件转换部分换成oXD.transformNodeToObject(xsl,Response)。这两个方法的不同之处就是前一个是生成了一个字符串变量,后一个是直接把转换后的XML数据保存到指定的节点里了。