在計(jì)算機(jī)科學(xué)中,可擴(kuò)展樣式表轉(zhuǎn)換語言(英語:Extensible Stylesheet Language Transformations,縮寫XSLT)是一種樣式轉(zhuǎn)換標(biāo)記語言,可以將XML數(shù)據(jù)檔轉(zhuǎn)換為另外的XML或其它格式,如HTML網(wǎng)頁,純文字。XSLT最末的T字母表示英語中的“轉(zhuǎn)換”(transformation)。它是XSL規(guī)范中的一部分,最新的建議版本為XSL 3.0。
通常將XSLT稱為可擴(kuò)展樣式表語言轉(zhuǎn)換(EXtensible Stylesheet Language Transformation)是一種將XML文檔轉(zhuǎn)換為其他格式(如XHTML)的方法。 本教程介紹了XSLT的基礎(chǔ)知識(shí),包含討論XSLT的所有基本組件以及示例。
以XSLT進(jìn)行格式轉(zhuǎn)換并不會(huì)變動(dòng)原始的數(shù)據(jù)文件;而會(huì)以現(xiàn)有數(shù)據(jù)產(chǎn)生新的內(nèi)容格式。作為輸入的通常是XML數(shù)據(jù)檔,或者由支持XQuery和XPath的數(shù)據(jù)模型處理器,其它來源的數(shù)據(jù)也能被轉(zhuǎn)換,例如關(guān)系數(shù)據(jù)庫表格或地理信息系統(tǒng)。
XSL規(guī)范的另外一部分是XSLF(Formatting Objects,代表格式化對(duì)象),又稱XSL-FO或XSLFO,已逐漸被CSS 3.0所取代。XSLT是一種圖靈完備的語言,它可以指定計(jì)算機(jī)能運(yùn)行的任何計(jì)算。
XSLT歷史
XSLT受到函數(shù)式編程語言和字符串模式匹配語言(如SNOBOL和AWK)的影響。它最直接的前輩是DSSSL,即為SGML的文件樣式描述語言。
-
XSLT 1.0版本:XSLT是二十世紀(jì)末萬維網(wǎng)聯(lián)盟(W3C)可擴(kuò)展樣式表語言(XSL)開發(fā)工作的一部分,該項(xiàng)目還產(chǎn)出了XSL-FO和XPath。編訂XSLT規(guī)范的委員會(huì)成員,包括編輯James Clark,具備DSSSL的工作經(jīng)驗(yàn)。W3C于1999年11月推薦發(fā)表了XSLT 1.0規(guī)范。
-
XSLT 2.0:XSL工作組在2001年嘗試新創(chuàng)1.1版本中斷之后,與XQuery工作組合作,產(chǎn)出了根基于XML綱要之上的XPath 2.0,具有更豐富的數(shù)據(jù)模型和類型系統(tǒng);而XSLT 2.0是由Michael Kay主導(dǎo)開發(fā)的,在2007年1月成為推薦狀態(tài)。然而至2010年,XSLT 1.0仍然被廣泛使用,因?yàn)榭蛻舳说木W(wǎng)絡(luò)瀏覽器尚未內(nèi)置支持XSLT 2.0,或因?yàn)樘幱贚AMP架構(gòu)環(huán)境中。
-
XSLT 3.0:于2017年6月8日成為W3C推薦書。主要新功能有:
-
流轉(zhuǎn)換:在以前版本中,整個(gè)輸入數(shù)據(jù)檔必須在處理之前被讀入內(nèi)存,在處理完成之前無法寫到輸出(盡管Saxon有流擴(kuò)展)。這個(gè)工作草案允許XML流,這對(duì)于處理內(nèi)存容納不下的過大數(shù)據(jù)檔,或者在XML管道中連串變換時(shí),是有用處的。
-
改進(jìn)大型樣式表的模塊化。
-
改進(jìn)動(dòng)態(tài)錯(cuò)誤的處理,例如xsl:try指令。
-
函數(shù)可以作為其它(高階)函數(shù)的參數(shù)。
設(shè)計(jì)模型與處理
XSLT處理器會(huì)取用一或多個(gè)XML源數(shù)據(jù)檔,加上一或多個(gè)XSLT樣式表,并處理它們以產(chǎn)生輸出文件。與廣泛實(shí)現(xiàn)的指令式編程語言(例如C編程語言)相反,XSLT是宣告式的。基本處理的范式是模式配比。模板規(guī)則只定義如何處理特定XPath模式相符的節(jié)點(diǎn),而不是列出在具有狀態(tài)的環(huán)境中運(yùn)行的一系列動(dòng)作;處理器在遇到某一模式匹配時(shí),那么模板規(guī)則的內(nèi)容就包含了,以函數(shù)式語句評(píng)估的直接成果:即結(jié)果樹,它是處理器輸出的基礎(chǔ)。
處理器遵循固定的算法。首先,假設(shè)樣式表已經(jīng)讀取和準(zhǔn)備好了,處理器從輸入的XML數(shù)據(jù)檔創(chuàng)建來源代碼樹。然后處理來源樹的根節(jié)點(diǎn),在樣式表中找到該節(jié)點(diǎn)相符的最佳模板,并評(píng)估模板的內(nèi)容。每一個(gè)模板中的指令通常要求處理器在結(jié)果樹中產(chǎn)生節(jié)點(diǎn),或者與根節(jié)點(diǎn)相同的方式,處理來源樹中的其它節(jié)點(diǎn)。從結(jié)果樹中獲取輸出。
處理器實(shí)現(xiàn)
-
Altova RaptorXML 服務(wù)器:支持XSLT 1.0和2.0的跨平臺(tái)引擎,大部分XPath 3.0,以及XSLT 3.0工作草案中的一些功能;也有XQuery支持。允許指令列操作以及利用COM,Java和.NET的接口,并且還包括一個(gè)內(nèi)置的HTTP服務(wù)器。
-
Exselt:在.NET框架上以F#編寫成的XSLT 3.0流處理器。完全支持XSLT 3.0草案,XPath 3.0推薦標(biāo)準(zhǔn)和XDM 3.0推薦標(biāo)準(zhǔn)。
-
libxslt是根據(jù)MIT授權(quán)發(fā)布的開放庫,可商業(yè)化且重復(fù)使用。它以libxml為基礎(chǔ)并以C語言實(shí)現(xiàn),有快速的性能和可移植性。它支持XSLT 1.0和EXSLT擴(kuò)展。
-
在指令列中可執(zhí)行xsltproc,它包含在macOS和許多Linux版本中,在微軟Windows系統(tǒng)則透過Cygwin使用。
-
Safari瀏覽器的WebKit引擎,和Chrome和Blink布局引擎,都利用libxslt庫進(jìn)行XSL轉(zhuǎn)換。
-
在Python,Perl,Ruby,PHP,Common Lisp,Tcl和C++等編程語言中也有相對(duì)的綁定。
-
MSXML和.NET。MSXML包括XSLT 1.0處理器。從MSXML 4.0它包括指令列的工具程序msxsl.exe。
-
Saxon:XSLT 3.0和XQuery 3.1處理器,有獨(dú)立操作的開源和專有版本,也提供了可用于Java,JavaScript和.NET的庫。
-
QuiXSLT:由Innovimax和INRIA以Java編程語言實(shí)現(xiàn)的XSLT 3.0處理器。
-
Xalan:來自Apache Software Foundation的開源XSLT 1.0處理器,可以獨(dú)立使用,也適用于Java和C++。
-
網(wǎng)絡(luò)瀏覽器:Safari,Chrome,F(xiàn)irefox,Opera 和Internet Explorer這些網(wǎng)絡(luò)瀏覽器都只支持XSLT 1.0;而如果以Saxon-CE和Frameless這樣的第三方協(xié)力產(chǎn)品,則可支持XSLT 2.0。瀏覽器有能力運(yùn)行XML文件的即時(shí)轉(zhuǎn)換,并在其視窗中顯示輸出。轉(zhuǎn)換方式有將XSL嵌入到XML數(shù)據(jù)檔中,或在XML數(shù)據(jù)檔中以導(dǎo)入XSL的指示來完成。由于Chrome的保守安全策略,可能無法使用導(dǎo)入XSL的指示。
-
XMLStarlet是“可用于轉(zhuǎn)換、查詢、驗(yàn)證和編輯XML數(shù)據(jù)檔的一組指令列工具程序。它可以將XSLT樣式表應(yīng)用于XML數(shù)據(jù)檔”,而且不需要Java。它使用libxslt支持XSLT 1.0。
-
Xuriella和Plexippus-xpath是用Common Lisp編程語言實(shí)現(xiàn)的XSLT 1.0處理器。
XSLT性能
早期大多數(shù)的XSLT處理器都是解釋器。近來字節(jié)碼越來越普遍,使用可移植的中間語言(如Java字節(jié)碼或.NET中間語言)作為目標(biāo)。然而,即使是解釋器的成品通常也提供單獨(dú)的分析和運(yùn)行階段,允許在內(nèi)存中創(chuàng)建優(yōu)化的表達(dá)式樹,并可重復(fù)使用以運(yùn)行多重轉(zhuǎn)換。在線上發(fā)行應(yīng)用程序時(shí),這方式有顯著的性能優(yōu)勢(shì),其中同樣的轉(zhuǎn)換每秒可多次應(yīng)用在不同的來源檔之上。這種分離處理反映在XSLT處理器的應(yīng)用編程接口(如JAXP)的設(shè)計(jì)中。
早期XSLT處理器很少被優(yōu)化過。讀取的樣式表成為文檔對(duì)象模型,而XSLT處理器會(huì)直接對(duì)它們產(chǎn)生作用。XPath引擎也沒有被優(yōu)化過。但是漸增地,XSLT處理器利用了函數(shù)式編程和數(shù)據(jù)庫查詢語言中發(fā)現(xiàn)的優(yōu)化技術(shù),例如表達(dá)式樹的靜態(tài)重寫(例如,將計(jì)算移出循環(huán)),以及惰性的流評(píng)估來減少過程中所占內(nèi)存的足跡(允許處理器對(duì)子表達(dá)式求值時(shí),“提早退出”而不必運(yùn)行全部,例如following-sibling::*)。許多處理器還使用比一般DOM實(shí)現(xiàn)更有效率(在空間和時(shí)間上)的樹表達(dá)式。
2014年6月,Debbie Lockett和Michael Kay推出了一個(gè)開放源代碼的標(biāo)竿測(cè)試框架,名稱為XT-Speedo。