JavaScript JavaScript與XML——“XSLT”的注意要點

Oliveryoung發表於2016-02-23

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);

相關文章