xslt点滴

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.如何使用&nbsp;&amp;
解决方法:在xslt文档头部引入实体定义
<!DOCTYPE xsl:stylesheet [
  <!ENTITY nbsp "&#160;">
  <!ENTITY lt     "&#38;#60;">
  <!ENTITY gt     "&#62;">
  <!ENTITY amp    "&#38;#38;">
  <!ENTITY apos   "&#39;">
  <!ENTITY quot   "&#34;">
]>

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'});
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值