成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術(shù)文章
文章詳情頁

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

瀏覽:468日期:2022-06-04 11:56:40
由于前面的方法xslt需要在xml文件內(nèi)部直接導(dǎo)入,而項目中用到的xml文件是系統(tǒng)生成的,只能提供路徑,而沒有辦法改寫xml里面的內(nèi)容,所以需要找一個方法能夠在外部將xml和xslt關(guān)聯(lián)在一起,這樣既達到了目的,也可以應(yīng)用于多個xml文件,方便管理。
先上代碼,系統(tǒng)中使用module這個js進行打包,module這個工具是專門用來將js進行打包,這個工具以后的文章再做介紹,我自己現(xiàn)在只會使用,還沒研究其底層的代碼;這邊我們將js寫在一個文件里面,包括類以及類實現(xiàn)的方法,
下面是js代碼:transform.js
復(fù)制代碼 代碼如下:
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("你的系統(tǒng)沒有安裝 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
復(fù)制代碼 代碼如下:
<!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這個構(gòu)造函數(shù)是用來創(chuàng)建xml的dom元素,對于IE和FF,創(chuàng)建dom的方法不一樣,IE是用window.ActiveXObject這個方法來創(chuàng)建,而FF用document.implementation.createDocument這個方法來創(chuàng)建,我們用這兩個屬性來判斷是IE還是FF。
IE下針對不同版本的xml["MSXML2.DOMDocument.5.0", "MSXML2.DOMDocument.4.0", "MSXML2.DOMDocument.3.0", "MSXML2.DOMDocument","Microsoft.XmlDom"],用for循環(huán)進行遍歷查找到對應(yīng)的版本再new ActiveXObject(arrSignatures[i])建立dom;
FF下用document.implementation.createDocument("", "", null);直接創(chuàng)建dom ;
如果瀏覽器不支持 XML DOM object則throw錯誤 。
transformXSLT這個構(gòu)造函數(shù)用XSLT將xml轉(zhuǎn)換成html,F(xiàn)F下沒有transformNode這個方法,所以我們自己構(gòu)造了一個方法,
復(fù)制代碼 代碼如下:
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;
}

然后用這個方法實現(xiàn)轉(zhuǎn)換,在處理錯誤上IE和FF又有不同的處理方法,IE比較簡單,有一個parseError屬性裝載錯誤信息,errorCode是錯誤的代碼,reason是錯誤原因,line是錯誤的行號,還有其他一些信息,這里只要顯示主要的錯誤信息就可以了,如果出錯了就顯示出錯內(nèi)容,如果沒有出錯則顯示轉(zhuǎn)換的結(jié)果sResult。FF下就比較復(fù)雜一點,用XMLSerializer和XMLSerializer.serializeToString()將xmlDom轉(zhuǎn)換為字符串,再將字符串轉(zhuǎn)換成dom對象,在轉(zhuǎn)換的過程中如果報錯,就能得到包含有parsererror的信息,判斷得到的字符串的tagName是不是parsererror,如果是則將dom對象再轉(zhuǎn)換成字符串拋出字符串中的內(nèi)容,如果不是則顯示轉(zhuǎn)換的結(jié)果sResult。
這里有幾個注意點:
a.IE能檢驗出XML的DTD錯誤,而FF下只能檢驗出XML本身的語法錯誤;
b.因為需要在瀏覽器下判斷錯誤,最終的結(jié)果不好合并,可能代碼結(jié)構(gòu)上看起來不太合理,這也是無奈之舉。
用TransformBinder這個類進行封裝,便于擴展和修改。TransformBinder.prototype.registerAction這個原型用于注冊事件,再用TransformBinder.prototype.bind將事件進行綁定,需要使用這個類的時候,只需要new TransformBinder(XML,XSL),注冊transformXSLT事件,再bind進行綁定,這樣就實現(xiàn)這個效果了。如果需要擴展,再創(chuàng)建新的構(gòu)造函數(shù),注冊并綁定到這個類上就可以實現(xiàn)效果。
標(biāo)簽: XML/RSS
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
欧美日韩一级大片网址| 同产精品九九九| 亚洲码国产岛国毛片在线| 成人免费不卡视频| 亚洲激情自拍| 日韩欧美一级二级三级| 美女视频黄免费的久久 | 伊人开心综合网| 94-欧美-setu| 精品日产卡一卡二卡麻豆| 狠狠色伊人亚洲综合成人| 久久久夜精品| 午夜精品久久一牛影视| 在线观看不卡| 国产精品丝袜黑色高跟| 成人黄色在线网站| 日韩欧美国产精品| 国产成人超碰人人澡人人澡| 欧美卡1卡2卡| 国产精品自拍三区| 3751色影院一区二区三区| 日日夜夜免费精品| 亚洲一区二区精品在线观看| 亚洲精品视频在线观看网站| 国产在线播放一区| 欧美在线播放一区| 日韩精品一区二区三区视频| 国产精品自拍在线| 欧美蜜桃一区二区三区| 精品亚洲免费视频| 欧美日产国产精品| 国产黄人亚洲片| 91精品国产黑色紧身裤美女| 国产精品一区二区91| 日韩一区二区麻豆国产| 丁香啪啪综合成人亚洲小说| 91精品国产一区二区三区蜜臀| 一区二区在线观看免费| 日韩视频一区| 亚洲高清视频中文字幕| 久久精品成人一区二区三区蜜臀| 视频一区在线播放| 色猫猫国产区一区二在线视频| 婷婷成人综合网| 欧美天堂一区二区三区| 国产麻豆日韩欧美久久| 日韩精品在线一区| 99久久婷婷国产综合精品电影| 国产欧美1区2区3区| 欧美人与禽性xxxxx杂性| 国产精品高清亚洲| 91久久亚洲| 亚洲www啪成人一区二区麻豆| 亚洲一区二区精品在线| 日本vs亚洲vs韩国一区三区| 欧美久久久影院| 波多野结衣中文字幕一区二区三区 | 亚洲天天做日日做天天谢日日欢 | 99久久免费精品高清特色大片| 337p日本欧洲亚洲大胆色噜噜| 欧美在线观看天堂一区二区三区| 国产精品女主播在线观看| 在线视频观看日韩| 亚洲第一精品在线| 欧美性极品少妇| 国产传媒久久文化传媒| 国产日韩精品一区二区三区| 亚洲日本视频| 日韩黄色小视频| 欧美日韩精品系列| av中文字幕在线不卡| 中文字幕一区日韩精品欧美| 国产日韩高清一区二区三区在线| 日韩中文字幕麻豆| 欧美日本在线视频| 99re这里只有精品首页| 亚洲色图视频免费播放| 久久国产精品一区二区三区四区| 国产综合色精品一区二区三区| 精品久久人人做人人爰| 亚洲视频一二| 午夜伊人狠狠久久| 91精品国产综合久久蜜臀| 午夜久久久久| 午夜视频一区二区三区| 日韩欧美一级在线播放| 红桃视频国产精品| 国产在线一区二区三区四区 | 91原创在线视频| 国产亚洲综合av| 在线亚洲成人| 中文字幕在线观看一区| 国产精品一级| 麻豆91精品91久久久的内涵| 欧美一区二区三区男人的天堂| 欧美一区亚洲| 亚洲综合免费观看高清完整版 | 极品瑜伽女神91| 精品国产乱码久久久久久蜜臀 | 欧美久久一区| 亚洲特级片在线| 欧美三区在线观看| a美女胸又www黄视频久久| 亚洲人成网站色在线观看 | 欧美日本韩国一区二区三区视频 | 午夜在线a亚洲v天堂网2018| 亚洲国产日韩欧美| 欧美三级日韩三级| 欧美国产精品一区二区| 美女网站在线免费欧美精品| 欧美/亚洲一区| 欧洲av在线精品| 国产清纯美女被跳蛋高潮一区二区久久w | 欧美性猛片xxxx免费看久爱| 国产区在线观看成人精品| 久久精品99久久久| 精品9999| 久久久久久久久蜜桃| 日韩精品欧美成人高清一区二区| 99国产精品久久久久久久久久久| 91国偷自产一区二区开放时间| 国产精品美女一区二区三区 | 欧美少妇一区二区| 一区二区三区日本| 91在线云播放| 这里只有精品电影| 日韩国产精品大片| 国产精品久久国产三级国电话系列| 久久久亚洲高清| 国产成人在线电影| 欧美性受xxxx黑人xyx| 性感美女极品91精品| 亚洲色诱最新| 亚洲三级在线免费| 狠狠88综合久久久久综合网| 久久综合网色—综合色88| 国产精品99久| 国产精品入口| 综合精品久久久| 欧美久久影院| 国产精品欧美一区喷水| 国产成人免费在线观看不卡| 欧美欧美欧美欧美首页| 九九在线精品视频| 精品视频1区2区3区| 蜜桃视频第一区免费观看| 色国产精品一区在线观看| 日韩精品欧美精品| 色婷婷狠狠综合| 国内精品免费**视频| 美日韩免费视频| 日韩激情视频在线观看| 久久精品伊人| 免费在线视频一区| 777午夜精品视频在线播放| 日韩欧美黄色影院| 成人精品免费网站| 欧美精品一二三| 波多野洁衣一区| 国产偷久久久精品专区| 亚洲影院久久精品| 激情自拍一区| 亚洲高清不卡在线| 在线免费观看日本欧美| 国产精品一二三区在线| 亚洲欧美日韩专区| 午夜精品久久久久久久| 欧美在线观看禁18| 国产999精品久久久久久| 欧美性色综合网| 99久久精品99国产精品| 国产校园另类小说区| 国产精品永久| 国内精品伊人久久久久影院对白| 亚洲精品一线二线三线| 欧美日韩三区四区| 亚洲综合图片区| 欧美日韩色综合| 欧美激情综合| 一级精品视频在线观看宜春院| 欧美综合天天夜夜久久| 91麻豆精品秘密| 欧美一区二区啪啪| 欧美精品国产一区| 视频在线在亚洲| 国产欧美日韩另类一区| 欧美日本一区| 久久国内精品自在自线400部| 1024国产精品| 日韩欧美一区中文| 亚洲综合视频一区| 亚洲国产aⅴ成人精品无吗| 欧美久久久影院| 亚洲日本欧美在线| 高清在线不卡av| 奇米888四色在线精品| 精品乱人伦小说| 亚洲高清在线| 玖玖九九国产精品| 洋洋成人永久网站入口|