在Mozilla/Firefox中使用JavaScript和 XSLT

作者:onestab

簡介

由于現(xiàn)代的瀏覽器都支持 XSLT,開發(fā)者現(xiàn)在可以借助于 JavsScript 利用 XSLT 的強大功能。Web 應(yīng)用程序可使用JavaScript 載入XML數(shù)據(jù)、通過 XSLT 將其轉(zhuǎn)換成指定的顯示格式,并添加到當(dāng)前的頁面。由于 XML 文檔只包含數(shù)據(jù)信息,而不管如何顯示,所以可以非常快速地載入。

從 Mozilla 1.2 開始, Gecko 支持從 JavsScript 創(chuàng)建 XSLT 處理器,本文討論了如何在基于Gecko引擎的瀏覽器中使用 JavsScript 進行 XSLT 轉(zhuǎn)換。

Gecko 中的 JavaScript 與 XSLT

JavaScript 可以通過 XSLTProcessor 對象實現(xiàn) XSLT 轉(zhuǎn)換,XSLTProcessor 對象有一個 importStylesheet 方法,該方法的參數(shù)是一個轉(zhuǎn)換用的 XSLT 樣式表,該樣式表其實也是一個 XML 文件,也就是說,在調(diào)用 importStylesheet 之前必須先裝入該 .xsl 文件。我們可以通過 XMLHttpRequestXMLDocument.load 方法將其載入。

圖一:初始化 XSLTProcessor 對象

var xlstProcessor = new XSLTProcessor();
// 使用同步的方式裝入 xsl 文件
var myRequest = new XMLHttpRequest();
myRequest.open("GET", "example.xsl", false);
myRequest.send(null);
var xslRef = myRequest.responseXML;
// 現(xiàn)在可以引入 xsl了
xsltProcessor.importStylesheet(xslRef);

被轉(zhuǎn)換的 XML 文檔可通過另一個 XMLDocument 對象載入,也可以是HTML DOM 的一個片斷。要處理 HTML DOM 的片斷,這里假定它包含在 id 為 example 的元素中,首先要在內(nèi)存中創(chuàng)建一個 XMLDocument,再使用 XMLDocument 的 importNode 方法,這個方法允許我們在文檔之間傳遞 DOM 片斷(此處為從 HTMLDocument 到 XMLDocument)。importNode 方法的第一個參數(shù)是被克隆的 DOM 結(jié)點,第二個參數(shù)表示克隆的"深度",如果設(shè)置為 true,則克隆該結(jié)點的所有子孫結(jié)點,即"深度克隆"。克隆出來的 DOM 結(jié)點可以很容易地使用 appendChild 方法插入到 XMLDocument 中。

圖二:從 HTML 片斷創(chuàng)建 XML 文檔
  // 創(chuàng)建 XML 文檔對象
var xmlRef = document.implementation.createDocument("", "", null);
// 使用 importNode 將HTML DOM 的一部分轉(zhuǎn)換為XML 文檔。
// 參數(shù) true 表示克隆全部子元素。
var myNode = document.getElementById("example");
var clonedNode = xmlRef.importNode(myNode, true);
// 將克隆的結(jié)點添加到 XML 對象
xmlRef.appendChild(clonedNode);

引入了樣式表之后,就該進行真正的轉(zhuǎn)換了。XSLTProcessor 有兩種方法可供使用,分別是 transformToDocument()transformToFragment()transformToDocument() 返回一個完整的 XMLDocument, 而 transformToFragment() 則返回一個DOM片斷,可以很容易地插入到當(dāng)前頁面。二者都有求將 DOM Node 對象作為參數(shù),而 transformToFragment()還要求傳入類型為Document的第二個參數(shù),該對象將用來容納所產(chǎn)生的 DOM 片斷,如果該片斷將要插入到當(dāng)前頁面中,可直接傳入 document

圖三:實施轉(zhuǎn)換
var fragment = xsltProcessor.transformToFragment(xmlRef, document);

例1 - 基本的 XSLT 轉(zhuǎn)換

本例子演示了在基于Gecko引擎的瀏覽器(Mozilla/Firefox/Netscape)中使用 XMLHttpRequest 裝入 XML 和 XSL 文檔,并使用 XSLTProcessor 進行轉(zhuǎn)換。

查看實例 對不起,您正在使用的瀏覽器將無法運行示例。

設(shè)置 XSLT 的參數(shù)

使用現(xiàn)成的 .xsl 和 .xml 文件進行轉(zhuǎn)換當(dāng)然不錯,但如果使用 JavaScript 對其進行配置更為有用。例如,我們可使用 JavaScript 和 XSLT 對 XML 數(shù)據(jù)進行排序并顯示結(jié)果,排序方式可以是升序或降序。

XSLT 提供了 xsl:param 元素,可為XSLT設(shè)置參數(shù),它是 xsl:stylesheet 的子元素。XSLTProcessor 為訪問參數(shù)提供了三種方法: setParameter, getParameterremoveParameter。其第一個參數(shù)為 xsl:param 的名稱空間的 URI(通常我們用的都是默認的名稱空間,所以可直接傳入 "null" )。第二個參數(shù)是 xsl:param 的本地名稱,當(dāng)然,setParameter 的第三個參數(shù)是要設(shè)置的參數(shù)的值。

圖四:傳遞參數(shù)

XSLT 片斷:
<xsl:param name="myOrder" />
JavaScript:
var sortVal = xsltProcessor.getParameter(null, "myOrder");
if (sortVal == "" || sortVal == "descending")
xsltProcessor.setParameter(null, "myOrder", "ascending");
else
xsltProcessor.setParameter(null, "myOrder", "descending");

例2 - 設(shè)置XSLT參數(shù)

本例演示了在基于Gecko引擎的瀏覽器(Mozilla/Firefox/Netscape)中將HTML DOM 片斷轉(zhuǎn)換為 XML 片斷,使用 XMLHttpRequest 裝入 XSL 文檔,獲取并設(shè)置 XSLT 的參數(shù),用 XSLTProcessor 實施轉(zhuǎn)換,再將轉(zhuǎn)換后的結(jié)果動態(tài)添加到 HTML 文檔中。

查看例子 對不起,您正在使用的瀏覽器將無法運行示例。

XSLTProcessor 接口列表

XSLTProcessor 方法

void importStylesheet(DOMNode styleSheet)
引入 XSLT 樣式表 styleSheet 為 XSLT stylesheet 的根結(jié)點。
DOMDocumentFragment transformToFragment(DOMNode source, DOMDocument owner)
使用由importStylesheet()引入的樣式表對結(jié)點source進行轉(zhuǎn)換,owner 結(jié)點是容納轉(zhuǎn)換結(jié)果的 DOMDocument.
DOMDocument transformToDocument(DOMNode source)
使用由importStylesheet()引入的樣式表對結(jié)點source進行轉(zhuǎn)換.
void setParameter(String namespaceURI, String localName, Variant value)
設(shè)置 XSLT stylesheet 的參數(shù)。
Variant getParameter(String namespaceURI, String localName)
取得 XSLT stylesheet 的參數(shù)的值。
void removeParameter(String namespaceURI, String localName)
去除 XSLT stylesheet 指定參數(shù)的值,這將導(dǎo)致 XSLT 使用默認的參數(shù)值。
void clearParameters()
去除 XSLT stylesheet 中所有參數(shù)的值,這將導(dǎo)致 XSLT 使用默認的參數(shù)值。
void reset()
從 XSLTProcessor 中去除所有樣式表和參數(shù)。

瀏覽器差異

Netscape 7.x, Mozilla 1.2x 和 Firefox 0.9x 以及 Internet Explorer 6 (Windows) 支持 W3C XSLT 1.0 標(biāo)準 (http://www.w3.org/TR/xslt). IE 5.0 和 5.5 僅只持 XSLT 草案, 與 XSLT 1.0 stylesheets 不兼容。

相關(guān)資源

  • Scriptable Objects Gecko 引擎瀏覽器腳本對象參考。
  • DevEdge 原 developer.netscape.com 上的文章集錦。developer.netscape.com 于 2004年10月關(guān)閉。