1。引入文档声明
xhtml文件开头要求有文档声明,例aspx自动产生的是
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
解决方法:
在xslt文件中声明
<xsl:output method="html"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
doctype-public="-//W3C//DTD XHTML 1.1//EN"
indent="yes"/>
2.引入脚本
在xslt文件中可以一般的使用
<script type="text/javascript">
//your script
</script>
但脚本中如果有<>这样的特殊字符,则会在ie引发转义,ff不会
解决方案:引入disable-output-escaping,因为ie支持这个属性,但ff不支持
<script type="text/javascript">
<xsl:text disable-output-escaping="yes">
<![CDATA[
//your script
]]>
</xsl:text>
3.如何使用 &
解决方法:在xslt文档头部引入实体定义
<!DOCTYPE xsl:stylesheet [
<!ENTITY nbsp " ">
<!ENTITY lt "&#60;">
<!ENTITY gt ">">
<!ENTITY amp "&#38;">
<!ENTITY apos "'">
<!ENTITY quot """>
]>
4.输出CDATA节点的内容,IE可以使用disable-output-escaping="yes",但firefox会不支持,可以通过判断processor是Transformiix,然后再调用脚本即可,此方法使用了innerHTML,所以其中的脚本不会被运行,如果想运行其间的脚本,可参见第五点
解决方法: test="system-property('xsl:vendor')='Transformiix'"(mozilla内核的浏览器都是使用Transformiix)例:
<div id="pagecontent{position()}" style="display:inline">
<xsl:value-of select="." disable-output-escaping="yes"/>
<xsl:if test="system-property('xsl:vendor')='Transformiix'">
<script type="text/javascript">
Ext.onReady(function(){
var parent=document.getElementById('pagecontent<xsl:value-of select ="position()"/>');
parent.innerHTML=parent.childNodes[0].data;
});
</script>
</xsl:if>
</div>
5.document在firefox和ie中对当前目录的定义不一样,前者依赖于xslt,后者依赖于xml,所以应禁用document,改用javascript脚本调用xml+xslt
解决方法:使用javascript
var ua=navigator.userAgent.toLowerCase();
var isOpera=ua.indexOf("opera")>-1;
var isIE=!isOpera&&ua.indexOf("msie")>-1;

var xmlTrans=function(config){
var retval = xslStylesheet = xmlDocument = null;
var loadDocument = function (fileStr) {
if (!fileStr) throw new Error("调用XMLHTTP错误,没有指定文件名。");
var req = isIE?new ActiveXObject("MSXML2.XMLHTTP"):new XMLHttpRequest();
req.open("GET", fileStr, false);
req.send(null);
if (req.readyState==4 && req.status==200) {
return req.responseXML;
}
else {
throw new Error("调用XMLHTTP错误,远程文件"+fileStr+"失败.");
}
};
var ready2Transform = function () {
if(config.xml){
xmlDocument = loadDocument(config.xml);
}
else{
if(isIE){
xmlDocument = new ActiveXObject("Microsoft.XMLDOM")
xmlDocument.async="false"
xmlDocument.loadXML(config.xmldoc)
}
else{
xmlDocument = (new DOMParser()).parseFromString(config.xmldoc, "text/xml");
}
}
if(config.xslt){
xslStylesheet = loadDocument(config.xslt);
}
else{
if(isIE){
xslStylesheet = new ActiveXObject("Microsoft.XMLDOM")
xslStylesheet.async="false"
xslStylesheet.loadXML(config.xsltdoc)
}
else{
xslStylesheet = (new DOMParser()).parseFromString(config.xsltdoc, "text/xml");
}
}
};
var parseFromMoz = function () {
var xsltProcessor = new XSLTProcessor();
xsltProcessor.importStylesheet(xslStylesheet);
var retval = xsltProcessor.transformToDocument(xmlDocument);
var sretval=(new XMLSerializer()).serializeToString(retval);
if(sretval.indexOf('<transformiix:result')>-1){
sretval=sretval.substring(sretval.indexOf('>')+1,sretval.lastIndexOf('<'));
}
return sretval
};
var parseFromIE = function () {
var strval=xmlDocument.transformNode(xslStylesheet.documentElement);
if(strval.indexOf('<?xml')>-1){
var indexof=strval.indexOf('>');
strval=strval.substring(indexof+1,strval.length);
}
return strval;
};
ready2Transform();
if (isIE) {
retval = parseFromIE();
}
else{
retval = parseFromMoz();
}
if(config.el){
var el=document.getElementById(config.el);
if(config.add){
el.innerHTML+=retval;
}
else{
el.innerHTML=retval;
}
var regExp=/<script[^>]*>([sS]*?)</script>/gi;
if(regExp.test(el.innerHTML)){
eval(RegExp.$1);
}
}
return retval;
}
其中config定义为
config={
xml:value//指定xml文件源
xmldoc:value//以字符串方式直接传入的xml格式字符串
xslt:value//指定xslt文件源
xsltdoc:value//以字符串方式直接传入的xml格式字符串
el:value//指示要改变的dom节点id,
add:value//是否以添加的方式加入节点
}
例:xmlTrans({xml:'/data/anheiswapimage.xml',xslt:'/xslt/content/anheiswapimage.xslt',el:'navAH'});
xhtml文件开头要求有文档声明,例aspx自动产生的是
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
解决方法:
在xslt文件中声明
<xsl:output method="html"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
doctype-public="-//W3C//DTD XHTML 1.1//EN"
indent="yes"/>
2.引入脚本
在xslt文件中可以一般的使用
<script type="text/javascript">
//your script
</script>
但脚本中如果有<>这样的特殊字符,则会在ie引发转义,ff不会
解决方案:引入disable-output-escaping,因为ie支持这个属性,但ff不支持
<script type="text/javascript">
<xsl:text disable-output-escaping="yes">
<![CDATA[
//your script
]]>
</xsl:text>
3.如何使用 &
解决方法:在xslt文档头部引入实体定义
<!DOCTYPE xsl:stylesheet [
<!ENTITY nbsp " ">
<!ENTITY lt "&#60;">
<!ENTITY gt ">">
<!ENTITY amp "&#38;">
<!ENTITY apos "'">
<!ENTITY quot """>
]>
4.输出CDATA节点的内容,IE可以使用disable-output-escaping="yes",但firefox会不支持,可以通过判断processor是Transformiix,然后再调用脚本即可,此方法使用了innerHTML,所以其中的脚本不会被运行,如果想运行其间的脚本,可参见第五点
解决方法: test="system-property('xsl:vendor')='Transformiix'"(mozilla内核的浏览器都是使用Transformiix)例:











5.document在firefox和ie中对当前目录的定义不一样,前者依赖于xslt,后者依赖于xml,所以应禁用document,改用javascript脚本调用xml+xslt
解决方法:使用javascript


























































































其中config定义为
config={
xml:value//指定xml文件源
xmldoc:value//以字符串方式直接传入的xml格式字符串
xslt:value//指定xslt文件源
xsltdoc:value//以字符串方式直接传入的xml格式字符串
el:value//指示要改变的dom节点id,
add:value//是否以添加的方式加入节点
}
例:xmlTrans({xml:'/data/anheiswapimage.xml',xslt:'/xslt/content/anheiswapimage.xslt',el:'navAH'});