亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > XML > 正文

一個用xslt樣式將xml解析為xhtml的類TransformBinder(兼容FF和IE7.0)

2024-09-05 20:55:01
字體:
來源:轉載
供稿:網友
由于前面的方法xslt需要在xml文件內部直接導入,而項目中用到的xml文件是系統生成的,只能提供路徑,而沒有辦法改寫xml里面的內容,所以需要找一個方法能夠在外部將xml和xslt關聯在一起,這樣既達到了目的,也可以應用于多個xml文件,方便管理。
先上代碼,系統中使用module這個js進行打包,module這個工具是專門用來將js進行打包,這個工具以后的文章再做介紹,我自己現在只會使用,還沒研究其底層的代碼;這邊我們將js寫在一個文件里面,包括類以及類實現的方法,
下面是js代碼:transform.js
復制代碼 代碼如下:www.49028c.com

var XmlDom=function(){
if (window.ActiveXObject) { // IE
var arrSignatures = ["MSXML2.DOMDocument.5.0", "MSXML2.DOMDocument.4.0",
"MSXML2.DOMDocument.3.0", "MSXML2.DOMDocument",
"Microsoft.XmlDom"];
for (var i=0; i < arrSignatures.length; i++) {
try {
var oXmlDom = new ActiveXObject(arrSignatures[i]);
return oXmlDom;
} catch (oError) {
//ignore
}
}
throw new Error("你的系統沒有安裝 MSXML.");
} else if(document.implementation.createDocument){ // Firefox
var oXmlDom = document.implementation.createDocument("", "", null);
return oXmlDom;
} else{
throw new Error("瀏覽器不支持 XML DOM object.");
}
}
var transformXSLT=function(_XML,_XSL) {
if (window.Node) {
Node.prototype.transformNode = function(XslDom) {
var oProcessor = new XSLTProcessor();
oProcessor.importStylesheet(XslDom);
var oResultDom = oProcessor.transformToDocument(myXmlDom);
var oSerializer = new XMLSerializer();
var sXml = oSerializer.serializeToString(oResultDom, "text/xml");
return sXml;
}
}
var myXmlDom = new XmlDom();
myXmlDom.async=false;
var myXslDom = new XmlDom();
myXslDom.async=false;
myXmlDom.load(_XML);
myXslDom.load(_XSL);
var sResult=myXmlDom.transformNode(myXslDom);
if(window.ActiveXObject){
if(myXmlDom.parseError.errorCode != 0){
var sError=myXmlDom.parseError;
var txt = "";
txt += "<br>錯誤代碼: ";
txt += sError.errorCode;
txt += "<br>錯誤原因: ";
txt += sError.reason;
txt += "<br>錯誤行號: ";
txt += sError.line;
document.write(txt);
}else{
document.write(sResult);
}
} else if(document.implementation.createDocument){
var oSerializer = new XMLSerializer();
var sXmlDom = oSerializer.serializeToString(myXmlDom, "text/xml");
var oParser = new DOMParser();
var oXmlDom = oParser.parseFromString(sXmlDom,"text/xml");
if (oXmlDom.documentElement.tagName == "parsererror") {
var oXmlSerializer = new XMLSerializer();
var sXmlError = oXmlSerializer.serializeToString(oXmlDom);
alert(sXmlError);
} else {
document.write(sResult);
}
}
}
var TransformBinder = function(XML,XSL) {
this.XML = XML;
this.XSL = XSL;
}
TransformBinder.prototype.registerAction = function(handlers) {
this.handlers = handlers;
}
TransformBinder.prototype.bind = function() {
var _this = this;
this.handlers(_this.XML,_this.XSL);
}

下面是html代碼:XSLTtransform.htm
復制代碼 代碼如下:www.49028c.com

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type='text/javascript' src="transform.js"></script>
</head>
<body>
<script type="text/javascript">
var XML = "這里輸入XML路徑";
var XSL = "這里輸入XSL路徑";
var tempObj = new TransformBinder(XML,XSL);
tempObj.registerAction(transformXSLT);
tempObj.bind();
</script>
</body>
</html>

分析一下transform.js:
xmlDom這個構造函數是用來創建xml的dom元素,對于IE和FF,創建dom的方法不一樣,IE是用window.ActiveXObject這個方法來創建,而FF用document.implementation.createDocument這個方法來創建,我們用這兩個屬性來判斷是IE還是FF。
IE下針對不同版本的xml["MSXML2.DOMDocument.5.0", "MSXML2.DOMDocument.4.0", "MSXML2.DOMDocument.3.0", "MSXML2.DOMDocument","Microsoft.XmlDom"],用for循環進行遍歷查找到對應的版本再new ActiveXObject(arrSignatures[i])建立dom;
FF下用document.implementation.createDocument("", "", null);直接創建dom ;
如果瀏覽器不支持 XML DOM object則throw錯誤 。
transformXSLT這個構造函數用XSLT將xml轉換成html,FF下沒有transformNode這個方法,所以我們自己構造了一個方法,
復制代碼 代碼如下:www.49028c.com

Node.prototype.transformNode = function(XslDom) {
var oProcessor = new XSLTProcessor();
oProcessor.importStylesheet(XslDom);
var oResultDom = oProcessor.transformToDocument(myXmlDom);
var oSerializer = new XMLSerializer();
var sXml = oSerializer.serializeToString(oResultDom, "text/xml");
return sXml;
}

然后用這個方法實現轉換,在處理錯誤上IE和FF又有不同的處理方法,IE比較簡單,有一個parseError屬性裝載錯誤信息,errorCode是錯誤的代碼,reason是錯誤原因,line是錯誤的行號,還有其他一些信息,這里只要顯示主要的錯誤信息就可以了,如果出錯了就顯示出錯內容,如果沒有出錯則顯示轉換的結果sResult。FF下就比較復雜一點,用XMLSerializer和XMLSerializer.serializeToString()將xmlDom轉換為字符串,再將字符串轉換成dom對象,在轉換的過程中如果報錯,就能得到包含有parsererror的信息,判斷得到的字符串的tagName是不是parsererror,如果是則將dom對象再轉換成字符串拋出字符串中的內容,如果不是則顯示轉換的結果sResult。
這里有幾個注意點:
a.IE能檢驗出XML的DTD錯誤,而FF下只能檢驗出XML本身的語法錯誤;
b.因為需要在瀏覽器下判斷錯誤,最終的結果不好合并,可能代碼結構上看起來不太合理,這也是無奈之舉。
用TransformBinder這個類進行封裝,便于擴展和修改。TransformBinder.prototype.registerAction這個原型用于注冊事件,再用TransformBinder.prototype.bind將事件進行綁定,需要使用這個類的時候,只需要new TransformBinder(XML,XSL),注冊transformXSLT事件,再bind進行綁定,這樣就實現這個效果了。如果需要擴展,再創建新的構造函數,注冊并綁定到這個類上就可以實現效果。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91日韩在线视频| 国产精品美乳在线观看| 大胆人体色综合| 黄色一区二区三区| 91亚洲精品一区二区| 欧美日韩性生活视频| www国产精品视频| 久久天天躁日日躁| 日韩在线视频网站| 久久久久久久av| 欧美日韩精品国产| 在线日韩av观看| 亚洲无限av看| 欧美激情一区二区久久久| 亚洲免费中文字幕| 高清欧美性猛交xxxx黑人猛交| 久久999免费视频| 久久久精品久久久| 亚洲大胆人体视频| 亚洲跨种族黑人xxx| 色yeye香蕉凹凸一区二区av| 奇米成人av国产一区二区三区| 久久夜色精品亚洲噜噜国产mv| 精品亚洲一区二区三区在线播放| 日韩不卡中文字幕| 欧美一级视频在线观看| 秋霞午夜一区二区| 亚洲欧美国产制服动漫| 成人久久久久久| 精品亚洲精品福利线在观看| 日本老师69xxx| 亚洲人午夜精品| 欧美日韩一二三四五区| 精品女厕一区二区三区| 日韩精品视频在线播放| 精品久久久国产| 韩国精品美女www爽爽爽视频| 亚洲欧美制服中文字幕| 欧美日韩福利在线观看| 久久精品亚洲一区| 久久精品视频亚洲| 2019av中文字幕| 欧美成人精品h版在线观看| 欧美网站在线观看| 欧美精品性视频| 国产91在线播放九色快色| 国产国语videosex另类| 亚洲精品v欧美精品v日韩精品| 亚洲中国色老太| 92福利视频午夜1000合集在线观看| 国产亚洲精品美女久久久| 亚洲最新视频在线| 国产成人亚洲综合91精品| 久久久久久久久久久久av| 97在线视频精品| 亚洲精品美女在线观看| 欧美日韩加勒比精品一区| 国产成人亚洲综合91| www国产精品com| 国产精品国产福利国产秒拍| 亚洲深夜福利在线| 色偷偷综合社区| 一区二区三区www| 亚洲免费一在线| 97久久精品人人澡人人爽缅北| 国产视频精品va久久久久久| 欧美国产日韩精品| 欧美性猛交xxxx免费看漫画| 国产日本欧美在线观看| 欧美福利在线观看| 欧美性猛交xxxx乱大交| 亚洲少妇激情视频| 97视频在线观看免费| 日韩精品一区二区三区第95| 久久精品国产亚洲一区二区| 日韩免费av在线| 国产视频在线一区二区| 中文字幕一区二区精品| 国产精品爽爽ⅴa在线观看| 青青青国产精品一区二区| 国产一区二区动漫| 全球成人中文在线| 伊人久久精品视频| 91爱爱小视频k| 欧美性xxxx在线播放| 日韩电视剧免费观看网站| 久久在线观看视频| 欧美激情一二三| 国产亚洲免费的视频看| 91免费观看网站| 国产伦精品一区二区三区精品视频| 久久人人爽人人爽人人片亚洲| 欧美老女人在线视频| 国产一区二区三区毛片| 国产女人18毛片水18精品| 日韩欧中文字幕| 欧美激情喷水视频| 欧美色视频日本版| 欧美成人性色生活仑片| 美女扒开尿口让男人操亚洲视频网站| 日韩欧美视频一区二区三区| 国产亚洲一级高清| 久久精彩免费视频| 国产精品久久77777| 久久99热精品| 久久夜色精品国产欧美乱| 精品中文字幕在线2019| 国产精品成人久久久久| 久久精品中文字幕一区| 国产精品亚洲欧美导航| 国产午夜精品全部视频播放| 国产一区二区三区三区在线观看| 国产精品国产亚洲伊人久久| 亚洲精品自拍偷拍| 高清日韩电视剧大全免费播放在线观看| 自拍视频国产精品| 国产精品成人va在线观看| 欧美性猛交xxxx免费看久久久| 日韩av网址在线| 97在线免费观看视频| 久久久久久久网站| 国产亚洲欧洲在线| 久久久亚洲国产天美传媒修理工| 亚洲人成网站999久久久综合| 亚洲美女视频网| 欧美日韩免费一区| 欧美性感美女h网站在线观看免费| 色狠狠av一区二区三区香蕉蜜桃| 日韩免费在线视频| 日本欧美在线视频| 日韩欧美极品在线观看| 国产成人精品一区二区三区| 久久亚洲欧美日韩精品专区| 欧美成人黄色小视频| 欧美一级bbbbb性bbbb喷潮片| 91亚洲永久免费精品| 日韩一区av在线| 亚洲天堂免费在线| 亚洲欧美日韩精品| 国产日韩欧美黄色| 欧美极品第一页| 欧美性猛交xxxx黑人| 国产视频精品一区二区三区| 久久精品视频导航| 91系列在线播放| 日韩国产精品亚洲а∨天堂免| 激情av一区二区| 欧美成人一区在线| 亚洲精品丝袜日韩| 亚洲人成在线观看| 亚洲国产成人久久| 久久综合久久88| 青草青草久热精品视频在线观看| 国内精品久久久久久中文字幕| 久久91精品国产91久久跳| 久久99精品国产99久久6尤物| 成人www视频在线观看| 国产日韩在线看片| 久久网福利资源网站| 日韩av综合网| 亚洲成av人片在线观看香蕉| 欧美激情在线播放| 91久久精品久久国产性色也91| 欧美性猛交xxxx黑人猛交|