XML通过XSL转换生成HTML代码,如何指定输出的页面编码?(100分)

  • 主题发起人 主题发起人 CurveSoft
  • 开始时间 开始时间
C

CurveSoft

Unregistered / Unconfirmed
GUEST, unregistred user!
我把一个xml文件通过xsl文件转换成html,用的是TXMLDocument,解析器用的MSXML3,可是每次输出的html代码总是被加上这样一句:
<META http-equiv="Content-Type" content="text/html;
charset=UTF-16">
这样我的IE6就没法正常显示了,还需要点右键/编码/gb2312才能正常显示
我怎么让它转换的时候不要加上这一句,或者说,让它把charset=GB2312或者UTF-8,GBK?
 

在xml文件中,把第一行:字符集改一下就好了。
:)
<?xml version="1.0" encoding="GB2312"?>
 
早试过了,没用。我的代码:
xml.LoadFromFile('mxml.xml');
xslt.LoadFromFile('mxsl.xsl');
xml.Node.TransformNode(xslt.Node ,shtml);
Memo1.Lines.Text :=shtml;
Memo1.Lines.SaveToFile('aaa.html');
wbMain.Navigate('file://H:/Yiwei/Works/WebBrowser/Test8-XML-XSLT-TRANSFORM/aaa.html');
XML------------------
<?xml version="1.0" encoding="GB2312"?>
<smsBomb Version="1.0">
<Config/>
<Gateway Name="mail.monternet.com" RefURL="http://mail.monternet.com/free/gb/std/NULL/NULL/registration.gen" Delay="1000">
<Form Name="MobileCertify" PostURL="http://mail.monternet.com/free/gb/std/NULL/AA0300aimcregistration/registration.gen" Method="post" NumberField="numberGsm">
<Field Name="numberGsm" Value=""/>
<Field Name="request" Value="MobileCertify"/>
<Field Name="submit" Value=""/>
</Form>
</Gateway>
<Gateway Name="www.292.com.cn" RefURL="http://www.292.com.cn/zhuce.asp" Delay="2000">
<Form Name="form1" PostURL="http://www.292.com.cn/reg.asp" Method="post" NumberField="phonenumber">
<Field Name="phonenumber" Value=""/>
<Field Name="B12" Value="注册"/>
<Field Name="Reset" Value="重写"/>
</Form>
</Gateway>
<Gateway Name="sms.netandtv.com" RefURL="http://sms.netandtv.com/newsms/sendzhuce2.aspx" Delay="1000">
<Form Name="login" PostURL="http://sms.netandtv.com/newsms/reg1.aspx" Method="post" NumberField="mobile">
<Field Name="mobile" Value=""/>
<Field Name="Submit" Value="注册"/>
</Form>
</Gateway>
<Gateway Name="www.zdnet.com.cn" RefURL="http://152.104.225.3/smsapp/public_sms_mobile_reg_index" Delay="1000">
<Form Name="login" PostURL="http://152.104.225.3/smsapp/public_sms_mobile_reg_index" Method="post" NumberField="userinput">
<Field Name="userinput" Value=""/>
<Field Name="submit" Value="注册"/>
</Form>
</Gateway>
<Gateway Name="sms.sina.com.cn" RefURL="http://sms.sina.com.cn/docs/register.html" Delay="2000">
<Form Name=" " PostURL="http://sms.sina.com.cn/cgi-bin/sms/register.cgi" Method="post" NumberField="mobile">
<Field Name="mobile" Value=""/>
<Field Name="lang" Value="1"/>
<Field Name="ad_tag" Value="1"/>
<Field Name="hu_tag" Value="1"/>
</Form>
</Gateway>
<Gateway Name="sms.163.com" RefURL="http://mob.163.com/mobile/RegisterPop.html" Delay="1000">
<Form Name="form" PostURL="http://mob.163.com/mobile/RegisterPop2.jsp" Method="post" NumberField="username">
<Field Name="username" Value=""/>
<Field Name="image" Value=""/>
</Form>
</Gateway>
</smsBomb>
XSL--------------------------
<?xml version="1.0" encoding="gb2312"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/" >
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html;
charset=gb2312"/>
<link href="css.css" rel="stylesheet" type="text/css"/>
</head>
<body leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
<table width="100%" border="0" cellspacing="1" cellpadding="0" bgcolor="#000000">
<xsl:for-each select="/smsBomb/Gateway">
<tr bgcolor="#C1E1F9" height="30">
<td align="center">网关名称</td>
<td align="center">引用URL</td>
<td align="center">延迟</td>
</tr>
<xsl:variable name="color1">#FFFFFF</xsl:variable>
<xsl:variable name="color2">#EEF7FD</xsl:variable>
<xsl:element name="tr">
<xsl:attribute name="align">right</xsl:attribute >
<xsl:attribute name="height">18</xsl:attribute>
<xsl:attribute name="bgcolor">
<xsl:if test="position() mod 2 = 1">
<xsl:value-of select="$color1" />
</xsl:if >
<xsl:if test="position() mod 2 = 0">
<xsl:value-of select="$color2" />
</xsl:if >
</xsl:attribute>
<td align="center"><xsl:value-of select="@Name"/></td>
<td align="center">
<xsl:element name="a">
<xsl:attribute name="href"><xsl:value-of select="@RefURL"/></xsl:attribute>
<xsl:attribute name="target">_blank</xsl:attribute>
<xsl:value-of select="@RefURL"/>
</xsl:element>
</td>
<td align="center"><xsl:value-of select="@Delay"/></td>
</xsl:element>
<tr bgcolor="EEFDF7">
<td align="right" colspan="3">
<table cellspacing="1" cellpadding="0" width="98%" border="0" bgcolor="#112233">
<tr bgcolor="#eeffcc" height="25">
<td align="center">表单名称</td>
<td align="center">提交URL</td>
<td align="center">提交方法</td>
<td align="center">手机号字段</td>
</tr>
<tr bgcolor="#eeffcc" height="18">
<td align="center"><xsl:value-of select="Form/@Name"/></td>
<td align="center"><xsl:value-of select="Form/@PostURL"/></td>
<td align="center"><xsl:value-of select="Form/@Method"/></td>
<td align="center"><xsl:value-of select="Form/@NumberField"/></td>
</tr>
<tr bgcolor="white">
<td align="right" colspan="4">
<table cellspacing="1" cellpadding="0" width="98%" border="0" bgcolor="#445566">
<tr bgcolor="#ffffee" height="20">
<td align="center">字段名</td>
<td align="center">取值</td>
</tr>
<xsl:for-each select="Form/Field">
<tr bgcolor="#eeffff" height="18">
<td align="center"><xsl:value-of select="@Name"/></td>
<td align="center"><xsl:value-of select="@Value"/></td>
</tr>
</xsl:for-each>
</table>
</td>
</tr>
</table>
</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
 
以下我通过vbscript通过调试:
中文正常,你可以参考一下。:)

<HTML xmlns:signature="urn:schemas-microsoft-com:office:access">
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=UTF-8"/>
</HEAD>
<BODY ONLOAD="ApplyTransform()">
</BODY>
<SCRIPT LANGUAGE="VBScript">
Option Explicit
Function ApplyTransform()
Dim objData, objStyle

Set objData = CreateDOM
LoadDOM objData, "mxml.xml"

Set objStyle = CreateDOM
LoadDOM objStyle, "mxml.xsl"
Document.Open "text/html","replace"
Document.Write objData.TransformNode(objStyle)
End Function
Function CreateDOM()
On Error Resume Next
Dim tmpDOM
Set tmpDOM = Nothing
Set tmpDOM = CreateObject("MSXML2.DOMDocument.5.0")
If tmpDOM Is Nothing then
Set tmpDOM = CreateObject("MSXML2.DOMDocument.4.0")
End If
If tmpDOM Is Nothing then
Set tmpDOM = CreateObject("MSXML.DOMDocument")
End If

Set CreateDOM = tmpDOM
End Function

Function LoadDOM(objDOM, strXMLFile)
objDOM.Async = False
objDOM.Load strXMLFile
If (objDOM.ParseError.ErrorCode <> 0) then
MsgBox objDOM.ParseError.Reason
End If
End Function

</SCRIPT>
</HTML>
 
你这个我跑不起来,提示“系统找不到指定的对象”
 
MSXML 显然你没有安装。
:)
下载一个,还是换个解决方案?
 
没安装delphi怎么解析出来的?IE6怎么解析出来的?没可能嘛
 
请将XSL文件的第二行换为如下试试,我的没有问题。
应当是MICROSOFT的MSXML支持的问题。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
 
不行,报异常“xsl:attribute不能用于名字空间http://www.w3.org/TR/WD-xsl”
 
你不要使用 3.0 以上的对象,使用 as 操作,把 xml 对象降为 2.0 或以下版本使用。
这时,msxml 还是会为你加一个多余的东西,但这次它是空的,类似下面:
<META http-equiv="Content-Type" content="text/html">
这样,在你 xsl 里定义的那句:
<meta http-equiv="Content-Type" content="text/html;
charset=gb2312"/>
就可以正常起作用了(建议放到 <title> 前面)。
试试看吧。
另外,我搞不懂,其实这个标签后面定义的会覆盖前面定义,事实上我机器上的 IE6 ,
就是同时声明
<META http-equiv="Content-Type" content="text/html;
charset=UTF-16">
<meta http-equiv="Content-Type" content="text/html;
charset=gb2312">
情况下,还是很正常地显示了 gb2312 ,你那里怎么会不行?嘿嘿,真不幸哦。
 
嘿嘿,我刚才死机了。重演了一次你的代码,原来是你的 xsl 中下面的错误:
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html;
charset=gb2312"/>
<link href="css.css" rel="stylesheet" type="text/css"/>
</head>
直接改成:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=gb2312"/>
<title></title>
<link href="css.css" rel="stylesheet" type="text/css"/>
</head>
以后,你定义的 meta 就可以覆盖掉 msxml 给你的 utf-16 的定义,因为一旦 title
被 IE 解码后,后面就使用相同的解码了,你把 gb2312 放在 title 后面,就失去了作
用。按上面做位置修改后,也就不需要降版本了。
 
放上面也是一样,不行[:(!]
 
算了,看来没法从根本上解决了,我老老实实用StringReplace替换成gb2312算了
 
先说一句,你的XSL写的真烂,没有层次感。
然后正题:这个问题根本不是问题,xslt标准里面就有,怎么不先看帮助?
<xsl:output method="html" encoding="gb2312"/>
 
也先说一句,拿出来的只是随便拷的样本
正题:你这办法早就试过了,你为什么不试一下再说?
 
你自己写一个小一点的XSL试不行吗?而且<meta http-equiv="Content-Type" content="text/html;
charset=gb2312"/>这一行根本就是多余的,最终浏览器获得字符集是在HTTP Head,如果你错误的设置了HTTPHead,怎么做都是不行的。
 
晕,我也发现了这个问题,倒底应该如何解决啊?
 
xslt 开头这样写:
<?xml version="1.0" encoding="GB2312"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="GB2312" version="4.0"/>
<xsl:template match="/">
....
</xsl:template>
即可正常gb2312
 
后退
顶部