日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

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

然后用這個(gè)方法實(shí)現(xiàn)轉(zhuǎn)換,在處理錯(cuò)誤上IE和FF又有不同的處理方法,IE比較簡(jiǎn)單,有一個(gè)parseError屬性裝載錯(cuò)誤信息,errorCode是錯(cuò)誤的代碼,reason是錯(cuò)誤原因,line是錯(cuò)誤的行號(hào),還有其他一些信息,這里只要顯示主要的錯(cuò)誤信息就可以了,如果出錯(cuò)了就顯示出錯(cuò)內(nèi)容,如果沒有出錯(cuò)則顯示轉(zhuǎn)換的結(jié)果sResult。FF下就比較復(fù)雜一點(diǎn),用XMLSerializer和XMLSerializer.serializeToString()將xmlDom轉(zhuǎn)換為字符串,再將字符串轉(zhuǎn)換成dom對(duì)象,在轉(zhuǎn)換的過(guò)程中如果報(bào)錯(cuò),就能得到包含有parsererror的信息,判斷得到的字符串的tagName是不是parsererror,如果是則將dom對(duì)象再轉(zhuǎn)換成字符串拋出字符串中的內(nèi)容,如果不是則顯示轉(zhuǎn)換的結(jié)果sResult。
這里有幾個(gè)注意點(diǎn):
a.IE能檢驗(yàn)出XML的DTD錯(cuò)誤,而FF下只能檢驗(yàn)出XML本身的語(yǔ)法錯(cuò)誤;
b.因?yàn)樾枰跒g覽器下判斷錯(cuò)誤,最終的結(jié)果不好合并,可能代碼結(jié)構(gòu)上看起來(lái)不太合理,這也是無(wú)奈之舉。
用TransformBinder這個(gè)類進(jìn)行封裝,便于擴(kuò)展和修改。TransformBinder.prototype.registerAction這個(gè)原型用于注冊(cè)事件,再用TransformBinder.prototype.bind將事件進(jìn)行綁定,需要使用這個(gè)類的時(shí)候,只需要new TransformBinder(XML,XSL),注冊(cè)transformXSLT事件,再bind進(jìn)行綁定,這樣就實(shí)現(xiàn)這個(gè)效果了。如果需要擴(kuò)展,再創(chuàng)建新的構(gòu)造函數(shù),注冊(cè)并綁定到這個(gè)類上就可以實(shí)現(xiàn)效果。
標(biāo)簽: XML/RSS
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久影院午夜精品| 国产精品日韩精品在线播放| 青草av.久久免费一区| 国产伦精品一区二区三区视频 | 国产精品尤物| 久久xxxx| 一区免费在线| 99久久99视频只有精品| 精品视频在线你懂得| 老司机精品视频网| 毛片在线网站| 久久午夜影院| 日韩中文字幕在线一区| 亚洲二区在线| 91超碰国产精品| 国产精品久久久久77777丨| 欧美日韩亚洲一区在线观看| 国产日韩欧美中文在线| 麻豆一区二区三| 免费日韩一区二区三区| 日韩在线a电影| 欧美国产一级| 亚洲精一区二区三区| 手机精品视频在线观看| 婷婷视频一区二区三区| 国产精品白丝av嫩草影院| 国产91欧美| 亚洲国产成人精品女人| 免费人成精品欧美精品| 日本午夜精品| 欧美丰满日韩| 麻豆久久精品| 欧美一级一区| 日韩电影免费网址| 伊人久久大香线蕉av不卡| 国产精品免费看| 日韩亚洲精品在线观看| 精品国产成人| 伊人久久亚洲美女图片| 奇米狠狠一区二区三区| 国产成人a视频高清在线观看| 99视频精品全部免费在线视频| 久久国产66| 国产精品videosex极品| 日韩欧美精品| 中文视频一区| 欧美精品导航| 国精品一区二区| 日韩国产精品久久久久久亚洲| 欧美伊人久久| 国产在线看片免费视频在线观看| 最新亚洲一区| 美女在线视频一区| 成人免费电影网址| 日韩欧美美女在线观看| 色黄视频在线观看| 男人操女人的视频在线观看欧美| 欧美激情aⅴ一区二区三区| 久久丁香四色| 国产一级成人av| 韩日一区二区| 激情综合自拍| 日本国产亚洲| 国产在线观看www| 亚洲欧美日韩综合国产aⅴ| 日本一不卡视频| 久久久噜噜噜| 国产欧美一级| 黄色亚洲免费| 国产91在线播放精品| 中文字幕一区日韩精品| 日本在线啊啊| 日韩精品视频一区二区三区| 欧美日韩中文一区二区| 久久午夜影院| 亚洲精品高潮| 亚洲精品国产偷自在线观看| 国产一区二区三区四区二区| 亚洲欧美专区| 一区二区自拍| 精品国产亚洲一区二区三区在线 | 蜜桃一区二区三区在线观看| 国产精品二区不卡| 国产伦理久久久久久妇女| 天堂成人免费av电影一区 | 精品一区二区三区中文字幕在线| 美日韩精品视频| 日韩在线观看不卡| 国产精品sm| 午夜在线精品偷拍| 国产91久久精品一区二区| 韩国女主播一区二区三区| 欧美成人基地| xxxxx性欧美特大| 日韩一级不卡| 在线精品福利| 久草精品视频| 欧美日中文字幕| 蜜臀va亚洲va欧美va天堂| 国产毛片精品久久| 国产精品久久亚洲不卡| 亚洲欧美日韩精品一区二区| 免费一二一二在线视频| 亚洲成人精品| 国产精品久久| 成人美女视频| 国产精品天天看天天狠| 韩国久久久久久| 在线一区免费| 久久国产人妖系列| 欧美日韩亚洲三区| 成人在线视频中文字幕| 国产精品高清一区二区| 97在线精品| 国内一区二区三区| 香蕉成人av| 欧产日产国产精品视频| av日韩中文| 精品一区二区三区中文字幕视频 | 国产一区二区高清| 精品国产一区二| 国产精品伦一区二区| 视频一区欧美精品| 婷婷综合六月| 黄色aa久久| 精品三级久久久| 久久精品xxxxx| 亚洲资源网站| 国产精品普通话对白| 精品久久网站| 国产麻豆一区二区三区| 亚洲免费成人| 不卡在线一区二区| 视频在线观看91| 亚洲专区视频| 免费在线观看视频一区| 国产一区 二区| 日韩av黄色在线| 日本不卡在线视频| 精品一区二区三区中文字幕 | 男女精品网站| 日本精品不卡| 日韩欧美一区二区三区在线观看| 亚洲爱爱视频| 伊人久久大香线蕉av不卡| 亚洲激情另类| 天堂精品久久久久| 国产极品模特精品一二| 97精品一区二区| 久久在线视频免费观看| 久久成人国产| 久久国内精品视频| 久久精品理论片| 国产精品原创| 99精品在线| 麻豆亚洲精品| 日韩高清电影一区| 麻豆久久久久久久| 国产精品亚洲一区二区三区在线观看| 欧美日韩精品免费观看视欧美高清免费大片 | 日本麻豆一区二区三区视频| 国产精品第一| 日韩深夜视频| 国产综合精品一区| 免费久久精品视频| 久久国产三级| 日本在线高清| 午夜在线播放视频欧美| 日本欧美一区| 人人草在线视频| 久久福利一区| 国产精品igao视频网网址不卡日韩| sm捆绑调教国产免费网站在线观看| 久久在线免费| 国产日韩欧美高清免费| 福利一区二区免费视频| 国产一级久久| 国产精品调教| 久久精品av| 日韩在线电影| 国产在线观看www| 免费成人在线视频观看| 免费在线欧美黄色| 亚洲在线观看| 日韩1区在线| 日韩综合小视频| 久久在线电影| 麻豆视频一区二区| 亚洲欧美日韩国产综合精品二区 | 中文字幕在线免费观看视频| 日韩精品一级中文字幕精品视频免费观看 | 国产精品一区三区在线观看| 欧美肉体xxxx裸体137大胆| 欧美亚洲综合视频| 激情综合自拍| 欧美极品中文字幕| 亚洲在线网站| 久久久久久一区二区| 日本在线不卡视频| 99久久激情|