一個用xslt樣式將xml解析為xhtml的類TransformBinder(兼容FF和IE7.0)
來源:易賢網(wǎng) 閱讀:886 次 日期:2014-08-10 17:16:55
溫馨提示:易賢網(wǎng)小編為您整理了“一個用xslt樣式將xml解析為xhtml的類TransformBinder(兼容FF和IE7.0)”,方便廣大網(wǎng)友查閱!

由于前面的方法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

代碼如下:

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

代碼如下:

<!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)造了一個方法,

代碼如下:

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)效果。

更多信息請查看IT技術(shù)專欄

更多信息請查看網(wǎng)絡(luò)編程

2025國考·省考課程試聽報名

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 加入群交流 | 手機站點 | 投訴建議
工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號:hfpxwx
咨詢QQ:526150442(9:00—18:00)版權(quán)所有:易賢網(wǎng)