IE中的XSTL
它不是一種正式的規範,, 是XPath的另一表現形式。 IE是第一個支援它的。
簡單的XSTL轉換
XML文件的方式就是將它們分別加到一個DOM文件中, 然後使用
-
transformNode()
方法。
這個方法接收一個引數, 即包含XSTL樣式表的文件。 呼叫這個方法之後會返回一個包含轉換資訊的字串。
xmldom.load("employees.xml");
xstldom.load("employees.xstl");
var result = xmldom.transformNodes(xstldom);
這個transformNode的引數可以是XML文件的DOM節點。 如果不是在文件元素上呼叫transformNode, 那麼轉換就會從呼叫節點上開始。
複雜的XSLT轉換
要使用複雜的XSTL轉換, 必須使用XSL模板和XSL處理器。 先要把XSTL樣式表載入到一個執行緒安全的XML文件中。
function createThreadSafeDocument() {
if (typeof arguments.callee.activeXString != "string") {
var versions = ["MSXML2.FreeThreadedDOMDocument.6.0", "MSXML2.FreeThreadedDOMDocument.3.0", "MSXML2.FreeThreadedDOMDocument"],
i, len;
for (i = 0, len = versions.length; i < len; i++) {
try {
new ActiveXObject(versions[i]);
arguments.callee.activeXString = versions[i];
break;
} catch (ex) {
//skip
}
}
}
return new ActiveXObject(arguments.callee.activeXString);
}
建立XSTL模板:
function createXSTLTemplate() {
if (typeof arguments.callee.activeXString != "string") {
var versions = ["MSXML2.FreeThreadedDOMDocument.6.0", "MSXML2.FreeThreadedDOMDocument.3.0", "MSXML2.FreeThreadedDOMDocument"],
i, len;
for (i = 0, len = versions.length; i < len; i++) {
try {
new ActiveXObject(versions[i]);
arguments.callee.activeXString = versions[i];
break;
} catch (ex) {
//skip
}
}
}
return new ActiveXObject(arguments.callee.activeXString);
}
下面是使用示例:
var xsltdom = createThreadSafeDocument();
xstldom.async = false;
xsltdom.load("employees.xslt");
var template = createXSTLTemplate();
template.stylesheet = xstldom;
var processor = tempalte.createProcessor();
processor.input = xmldom;
processor.transform();
var result = processor.output;
在建立了XSL處理器之後, 必須將要轉換的節點指定給input屬性。 這個值可以是一個文件, 也可以是文件的任何節點。 然後呼叫transform方法即可執行轉換並將結果作為字串儲存在output屬性中。 這些程式碼實現了transformNode相同的功能。 使用XSL處理器可以對轉換進行更多的控制, 同時也支援更高階的XSTL特性。
要將樣式表中的引數進行賦值處理, 可以使用addParaneter() 方法, 它接收兩個引數: 要設定的引數名稱和要指定的值。
processor.input = xmldom.documentElement;
processor.addParameter("message", "Hello wrold!");
processor.transform();
XSL處理器的另一個高階特性是能夠設定一種操作模式。 在XSTL中, 可以使用mode特性為模板定義一種模式在定義了模式之後, 如果沒有將 < xsl: apply – tempaltes > 與匹配的mode特性一起使用, 就不會執行該模板。 如果在 < xsl: apply – tempaltes > 元素的模式設定為“ title – first”, 那麼在javascript使用時就需要像下面這樣進行設定:
processor.input = xmldom;
processor.addParameter("message", "Hello wrold!");
processor.setStartMode("title-first");
processor.transform();
如果打算用一個XSTL樣式表進行多次轉換, 可以在每次轉換之後呼叫reset() 方法重置處理器。
processor.reset();
因為處理器已經編譯了XSTL樣式表, 與transformNode() 相比, 這樣的轉換速度會更快一些
XSLTProcessor型別
Mozilla通過火狐建立新型別, 其他非IE瀏覽器借鑑了它, 也實現了這個型別。 主要的功能是用來將XSLT轉換為XML文件。
第一步載入DOM文件, 一個基於XML, 另一個基於XSLT。 然後建立一個新XSLTProceesor物件, 並使用importStylesheet() 方法為其指定一個XSLT。 示例:
var processor = new XSLTProcessor();
processor.importStylesheet(xsltdom);
最後一步是執行轉換。 這一步有兩種不同的方式: 如果想返回一個完整的DOM文件, 可以呼叫
-
transformToDocument()
;
如果想返回一個文件片段, 可以使用
-
transformToFragment()
。
transformToDocument() 的引數是一個XML DOM。 transformToFragment() 的引數有兩個, 第一個是XML DOM, 第二個是擁有該文件片段的文件。
-
setParameter()
方法可以用來設定XSLT的引數, 該方法接收三個引數: 名稱空間URI, 引數的內部名稱和要設定的值。 這個方法必須在進行最後一步轉化之前呼叫。 -
getParameter()
方法用於取得當前引數的值, 引數為名稱空間URI和引數的內部名稱。 -
removeParameter()
方法用於移除當前引數的值, 引數為名稱空間URI和引數的內部名稱。
後面兩個方法並不常用, 提供他們只是為了方便。
重置處理器的方法是reset()
方法。
跨瀏覽器使用XSLT
function transform(context, xslt) {
if (typeof XSLTProcessor != "undefined") {
var processor = new XSLTProcessor();
processor.importStylesheet(xslt);
var result = processor.transformToDocument(context);
return (new XMLSerializer()).serializeToString(result);
} else if (typeof context.transformNode != "undefined") {
return caontext.transformNode(xslt);
} else {
throw new Error("No XSLT processor available.");
}
}
這個函式接收兩個引數: 要執行轉換的上下文節點和XSLT文件物件。 返回序列化之後的字串。
var result = transform(xmldom, xsltdom);