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处理器会取用一或多个XML源数据档，加上一或多个XSLT样式表，并处理它们以产生输出文件。与广泛实现的指令式编程语言（例如C编程语言）相反，XSLT是宣告式的。基本处理的范式是模式配比。模板规则只定义如何处理特定XPath模式相符的节点，而不是列出在具有状态的环境中运行的一系列动作；处理器在遇到某一模式符合时，那么模板规则的内容就包含了，以函数式语句评估的直接成果：即结果树，它是处理器输出的基础。
处理器遵循固定的算法。首先，假设样式表已经读取和准备好了，处理器从输入的XML数据档创建来源代码树。然后处理来源树的根节点，在样式表中找到该节点相符的最佳模板，并评估模板的内容。每一个模板中的指令通常要求处理器在结果树中产生节点，或者与根节点相同的方式，处理来源树中的其它节点。从结果树中获取输出。

性能

早期大多数的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文档内容：
<?xml version="1.0" ?><persons>
  <person username="JS1">
    <name>John</name>
    <family-name>Smith</family-name>
  </person>
  <person username="MI1">
    <name>Morka</name>
    <family-name>Ismincius</family-name>
  </person></persons>

例一（从XSL转换为XML）

以下XSLT样式表提供了转换XML 文档的模板：
<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/persons">
    <root>
      <xsl:apply-templates select="person"/>
    </root>
  </xsl:template>

  <xsl:template match="person">
    <name username="{@username}">
      <xsl:value-of select="name" />
    </name>
  </xsl:template></xsl:stylesheet>
它的评估结果是一个新的XML文档，有另一种结构：
<?xml version="1.0" encoding="UTF-8"?><root>
  <name username="JS1">John</name>
  <name username="MI1">Morka</name></root>

例二（从XML转换为XHTML）

如应用以下XSLT样式表：
<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns="http://www.w3.org/1999/xhtml">

  <xsl:output method="xml" indent="yes" encoding="UTF-8"/>

  <xsl:template match="/persons">
    <html>
      <head> <title>Testing XML Example</title> </head>
      <body>
        <h1>Persons</h1>
        <ul>
          <xsl:apply-templates select="person">
            <xsl:sort select="family-name" />
          </xsl:apply-templates>
        </ul>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="person">
    <li>
      <xsl:value-of select="family-name"/><xsl:text>, </xsl:text><xsl:value-of select="name"/>
    </li>
  </xsl:template></xsl:stylesheet>
将XML输入文件转换则产生如下XHTML（为了清楚起见，空格已被调整）：
<?xml version="1.0" encoding="UTF-8"?><html xmlns="http://www.w3.org/1999/xhtml">
  <head> <title>Testing XML Example</title> </head>
  <body>
    <h1>Persons</h1>
      <ul>
        <li>Ismincius, Morka</li>
        <li>Smith, John</li>
      </ul>
  </body></html>
网络浏览器中显示时，此XHTML会产生如下的输出。
为了使网络浏览器能够自动将XSL转换应用于显示的XML文档，XML的样式表处理指令可插入XML中。因此若上例二中的样式表为“example2.xsl”，则以下指令将把它添加到原来输入的XML中：
<?xml-stylesheet href="example2.xsl" type="text/xsl" ?>
本示例中，根据W3C规范（其类型应为text/xml），在技术上text/xsl类型是不正确的，但它是2009年以来唯一在浏览器之间，有广泛支持的媒体类型。