XSL_Transformations

在電腦科學中，**可延伸樣式表轉換語言**（英語：Extensible Stylesheet Language Transformations，縮寫 **XSLT**）是一種樣式轉換標記語言，可以將 XML 資料檔轉換為另外的 XML 或其它格式，如 HTML 網頁，純文字。XSLT 最末的 T 字母表示英語中的「轉換」（transformation）。它是 XSL 規範中的一部分，目前最新的建議版本為 XSL 3.0。

以 XSLT 進行格式轉換不會變動原始的資料檔案；而會以現有資料產生新的內容格式。作為輸入的通常是 XML 資料檔，或者由支援 XQuery 和 XPath 的資料模型處理器，其他來源的資料也能轉換，例如關聯式資料庫表格或地理資訊系統。

XSL 規範的另一部分是 XSLF（Formatting Objects，代表格式化物件）, 又稱 XSL-FO 或 XSLFO，目前已逐漸被 CSS 3.0 所取代。XSLT 是一種圖靈完備的語言，它可以指定計算機能執行的任何計算。

## 歷史

XSLT 受到函數式編程語言和字串模式匹配語言（如 SNOBOL 和 AWK）的影響。它最直接的前輩是 DSSSL，即為 SGML 的檔案樣式描述語言。

* XSLT 1.0 版本：XSLT 是二十世紀末全球資訊網協會（W3C）可擴展樣式表語言（XSL）開發工作的一部分，該專案還產出了 XSL-FO 和 XPath。編訂 XSLT 規範的委員會成員，包括編輯 James Clark，具備 DSSSL 的工作經驗。W3C 於 1999 年 11 月推薦發表了 XSLT 1.0 規範。
* XSLT 2.0：XSL 工作群組在 2001 年嘗試新創 1.1 版本中斷之後，與 XQuery 工作群組合作，產出了根基於 XML 綱要之上的 XPath 2.0，具有更豐富的資料模型和型別系統；而 XSLT 2.0 是由 Michael Kay 主導開發的，在 2007 年 1 月成為推薦狀態。然而至 2010 年，XSLT 1.0 仍然被廣泛使用，因為使用者端的網路瀏覽器尚未內建支援 XSLT 2.0，或因為處於 LAMP 架構環境中。
* XSLT 3.0：於 2017 年 6 月 8 日成為 W3C 推薦書。主要新功能有：
  * 流轉換：在以前版本中，整個輸入資料檔必須在處理之前被讀入記憶體，在處理完成之前無法寫到輸出（儘管 Saxon 有流擴展）。這個工作草案允許 XML 流，這對於處理記憶體容納不下的過大資料檔，或者在 XML 管道中連串變換時，是有用處的。
  * 改進大型樣式表的模組化。
  * 改進動態錯誤的處理，例如 `xsl:try` 指令。
  * 函式可以作為其他（高階）函式的參數。

## 設計模型與處理

XSLT 處理器會取用一或多個 XML 源資料檔，加上一或多個 XSLT 樣式表，並處理它們以產生輸出檔案。與廣泛實作的指令式程式語言（例如 C 程式語言）相反，XSLT 是宣告式的。基本處理的範式是模式配比。模板規則只定義如何處理特定 XPath 模式相符的節點，而不是列出在具有狀態的環境中執行的一系列動作；處理器在遇到某一模式符合時，那麼模板規則的內容就包含了，以函數式語句評估的直接成果：即結果樹，它是處理器輸出的基礎。

處理器遵循固定的演算法。首先，假設樣式表已經讀取和準備好了，處理器從輸入的 XML 資料檔建立來原始碼樹。然後處理來源樹的根節點，在樣式表中找到該節點相符的最佳模板，並評估模板的內容。每一個模板中的指令通常要求處理器在結果樹中產生節點，或者與根節點相同的方式，處理來源樹中的其它節點。從結果樹中取得輸出。

## 處理器實作

* Altova RaptorXML 伺服器：支援 XSLT 1.0 和 2.0 的跨平台引擎，大部分 XPath 3.0，以及 XSLT 3.0 工作草案中的一些功能；也有 XQuery 支援。允許指令列操作以及利用 COM，Java 和.NET 的介面，還包括一個內建的 HTTP 伺服器。
* Exselt：在.NET 框架上以 F# 編寫成的 XSLT 3.0 流處理器。完全支援 XSLT 3.0 草案，XPath 3.0 推薦標準和 XDM 3.0 推薦標準。
* libxslt 是根據 MIT 授權發佈的開放函式庫，可商業化且重複使用。它以 libxml 為基礎並以 C 語言實作，有快速的效能和可移植性。它支援 XSLT 1.0 和 EXSLT 擴展。
  * 在指令列中可執行 `xsltproc`，它包含在 macOS 和許多 Linux 版本中，在微軟 Windows 系統則透過 Cygwin 使用。
  * Safari 瀏覽器的 WebKit 引擎，和 Chrome 和 Blink 佈局引擎，都利用 libxslt 函式庫進行 XSL 轉換。
  * 在 Python、Perl、Ruby、PHP、Common Lisp、Tcl 和 C++ 等程式語言中也有相對的綁定。
* MSXML 和.NET。MSXML 包括 XSLT 1.0 處理器。從 MSXML 4.0 它包括指令列的工具程式 `msxsl.exe`。
* Saxon：XSLT 3.0 和 XQuery 3.1 處理器，有獨立操作的開源和專有版本，也提供了可用於 Java，JavaScript 和.NET 的函式庫。
* QuiXSLT：由 Innovimax 和 INRIA 以 Java 程式語言實作的 XSLT 3.0 處理器。
* Xalan：來自 Apache Software Foundation 的開源 XSLT 1.0 處理器，可以獨立使用，也適用於 Java 和 C++。
* 網路瀏覽器：目前 Safari，Chrome，Firefox，Opera 和 Internet Explorer 這些網路瀏覽器都只支援 XSLT 1.0；而如果以 Saxon-CE 和 Frameless 這樣的第三方協力產品，則可支援 XSLT 2.0。瀏覽器有能力執行 XML 檔案的即時轉換，並在其視窗中顯示輸出。轉換方式有將 XSL 嵌入到 XML 資料檔中，或在 XML 資料檔中以匯入 XSL 的指示來完成。由於 Chrome 的保守安全策略，可能無法使用匯入 XSL 的指示。
* XMLStarlet 是「可用於轉換、查詢、驗證和編輯 XML 資料檔的一組指令列工具程式。它可以將 XSLT 樣式表應用於 XML 資料檔」，而且不需要 Java。它使用 libxslt 支援 XSLT 1.0。
* Xuriella 和 Plexippus-xpath 是用 Common Lisp 程式語言實作的 XSLT 1.0 處理器。

 

### 效能

早期大多數的 XSLT 處理器都是直譯器。近來位元組碼越來越普遍，使用可移植的中間語言（如 Java 位元組碼或.NET 中間語言）作為目標。然而，即使是直譯器的成品通常也提供單獨的分析和執行階段，允許在記憶體中建立優化的表達式樹，並可重複使用以執行多重轉換。在線上發行應用程式時，這方式有顯著的效能優勢，其中同樣的轉換每秒可多次應用在不同的來源檔之上。這種分離處理反映在 XSLT 處理器的應用編程介面（如 JAXP）的設計中。

早期 XSLT 處理器很少被優化過。讀取的樣式表成為文件物件模型，而 XSLT 處理器會直接對它們產生作用。XPath 引擎也沒有被優化過。但是漸增地，XSLT 處理器利用了函數式編程和資料庫查詢語言中發現的優化技術，例如表達式樹的靜態重寫（例如，將計算移出迴圈），以及惰性的串流評估來減少過程中所佔記憶體的足跡（允許處理器對子表達式求值時，「提早登出」而不必執行全部，例如 `following-sibling::*[1]`）。許多處理器還使用比一般 DOM 實作更有效率（在空間和時間上）的樹表達式。

2014 年 6 月，Debbie Lockett 和 Michael Kay 推出了一個開放原始碼的標竿測試框架，名稱為 XT-Speedo。

## XPath

XSLT 使用 XPath 來選取資料來源樹的節點集合，並執行相關的轉換運算。XPath 還提供了一系列功能，XSLT 則將其功能進一步強化。在 3.0 版本前的 XSLT，使用的 XPath 版本都是相對應的。到了 XSLT 3.0 版本則將與 XPath 3.0 或 3.1 配合使用。在之前的版本，XSLT 和 XPath 規範在同一天發佈。然而到了 XSLT 3.0 版本，它不再和 XPath 的版本同步；XPath 3.0 於 2014 年 4 月成為推薦書，接著是 2017 年 2 月的 XPath 3.1；於 2017 年 6 月時才推出了 XSLT 3.0 版本。

## 與 XQuery 比較

XSLT 與 XQuery 的功能之間有互相重疊的部份，XQuery 最初被認為是大型 XML 資料檔集合的查詢語言。XSLT 2.0 和 XQuery 1.0 標準是由 W3C 內的不同工作群組開發的，它們彼此合作以確保處理作法可以共通地適用。它們都使用相同的資料模型，型別系統和函式庫，並且都包括了 XPath 2.0 作為子語言。

但這兩種語言因服務於不同社群的需求，而根植於不同的傳統上。XSLT 主要被認為是一種樣式語言，主要目標是在網路（當作網頁模板）、在螢幕或紙張，呈現給人類讀者觀看的 XML。而 XQuery 則類比為傳統中的資料庫查詢語言。因為這兩種語言起源於不同的社群，XSLT 偏重於處理彈性的敘述式資料應用上，而 XQuery 則偏重在資料處理方面，例如執行關係聯結的操作。

## 媒體類型

`<output>` 元素可以設定媒體類型的屬性 `media-type`，將結果輸出為該媒體類型（或 MIME），例如： 
`<xsl:output output =“xml”media-type =“application/xml“/>`

長時間以來在網際網路上沒有 XSLT 的註冊媒體類型，`text/xsl` 為實用上的標準。XSLT 1.0 規範建議泛用化的屬性 `text/xml` 和 `application/xml`，但其中沒有指出媒體類型的屬性值應當如何使用。隨著 XSLT 2.0 的發表，W3C 推薦使用 MIME 媒體類型 `application/xslt+xml`，之後這種類型已在 IANA 註冊。

1.0 之前的 XSLT 工作草案在範例中使用了 `text/xsl`，微軟在 Internet Explorer 和 MSXML 產品中採用這一媒體類型，而其他瀏覽器的 xml 樣式表處理指令也廣泛的認可。所以在實作中，瀏覽器使用者若想以處理指令來轉換 XML，應使用這種未註冊的媒體類型。

## 範例

關於分組問題請參閱 XSLT/Muenchian 分組。以下是當作範例中輸入的 XML 文件內容：

### 例一（從 XSL 轉換為 XML）

以下 XSLT 樣式表提供了轉換 XML 文件的模板：

它的評估結果是一個新的 XML 文件，有另一種結構：

### 例二（從 XML 轉換為 XHTML）

如應用以下 XSLT 樣式表：

將 XML 輸入檔案轉換則產生如下 XHTML（為了清楚起見，空格已被調整）：

網路瀏覽器中顯示時，此 XHTML 會產生如下的輸出。

為了使網路瀏覽器能夠自動將 XSL 轉換應用於顯示的 XML 文件，XML 的樣式表處理指令可插入 XML 中。因此若上例二中的樣式表為「example2.xsl」，則以下指令將把它添加到原來輸入的 XML 中：

本範例中，根據 W3C 規範（其類型應為 text/xml），在技術上 text/xsl 類型是不正確的，但它是 2009 年以來唯一在瀏覽器之間，有廣泛支援的媒體類型。

## 參考文獻

## 外部連結

* XSLT 1.0 W3C Recommendation （頁面存檔備份，存於網際網路檔案館）
* XSLT 2.0 W3C Working Draft （頁面存檔備份，存於網際網路檔案館）

**具體應用**

* Xalan-Java （頁面存檔備份，存於網際網路檔案館）
* Xalan-C++ （頁面存檔備份，存於網際網路檔案館）
* libxslt （頁面存檔備份，存於網際網路檔案館） the XSLT C library for Gnome
* Sablotron
* SAXON （頁面存檔備份，存於網際網路檔案館） by Michael Kay
* XT by James Clark
* Microsoft XSLT engine
* Mozilla has native XSLT support （頁面存檔備份，存於網際網路檔案館）
* X-Smiles （頁面存檔備份，存於網際網路檔案館） has native XSLT support
* <oXygen/> XSLT editor and debugger （頁面存檔備份，存於網際網路檔案館）

## 參見

* XML
* XSL
* XPath
* XSLF