XSLT

在计算机科学中，可扩展样式-{表}-转换语言（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指令。
**函数可以作为其他（高阶）函数的参数。

**设计模型与处理**
XSL转换处理程序示意图
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则偏重在资料处理方面，例如执行关系联结的操作。

**媒体类型**
元素可以设定媒体类型的属性media-type，将结果输出为该媒体类型（或MIME），例如：
长时间以来在网际网路上没有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文档内容：

John
Smith


Morka
Ismincius


**例一（从XSL转换为XML）**
以下XSLT样式表提供了转换 XML 文档的模板：











它的评估结果是一个新的XML文档，有另一种结构：
John
Morka

**例二（从XML转换为XHTML）**
如应用以下XSLT样式表：



Testing XML Example 

Persons










, 


将XML输入文件转换则产生如下XHTML（为了清楚起见，空格已被调整）：
Testing XML Example 

Persons

Ismincius, Morka
Smith, John


网路浏览器中显示时，此XHTML会产生如下的输出。
Rendered XHTML generated from an XML input file and an XSLT transformation.
为了使网路浏览器能够自动将XSL转换应用于显示的XML文档，XML的样式表处理指令可插入XML中。因此若上例二中的样式表为“example2.xsl”，则以下指令将把它添加到原来输入的XML中：
本范例中，根据W3C规范（其类型应为text/xml），在技术上text/xsl类型是不正确的，但它是2009年以来唯一在浏览器之间，有广泛支援的媒体类型。

**参考文献**

**外部连结**
  XSLT 1.0 W3C Recommendation date=20170813015028 -  XSLT 2.0 W3C Working Draft date=20060613010826 
具体应用-  Xalan-Java date=20220428090826 -  Xalan-C++ date=20220426143849 -  libxslt date=20220302042412  the XSLT C library for Gnome-  Sablotron-  SAXON date=20071022055608  by Michael Kay-  XT by James Clark-  Microsoft XSLT engine- Mozilla has native  XSLT support date=20110505041308 -  X-Smiles date=20220510212104  has native XSLT support-   XSLT editor and debugger date=20120623131004 

**参见**
 XML- XSL- XPath- XSLF