Loading AI tools
来自维基百科,自由的百科全书
在计算机科学中,可扩展样式表转换语言(英语: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的文件样式描述语言。
xsl:try
指令。XSLT处理器会取用一或多个XML源资料档,加上一或多个XSLT样式表,并处理它们以产生输出文件。与广泛实作的指令式编程语言(例如C编程语言)相反,XSLT是宣告式的。基本处理的范式是模式配比。模板规则只定义如何处理特定XPath模式相符的节点,而不是列出在具有状态的环境中执行的一系列动作;处理器在遇到某一模式符合时,那么模板规则的内容就包含了,以函数式语句评估的直接成果:即结果树,它是处理器输出的基础。
处理器遵循固定的算法。首先,假设样式表已经读取和准备好了,处理器从输入的XML资料档建立来源代码树。然后处理来源树的根节点,在样式表中找到该节点相符的最佳模板,并评估模板的内容。每一个模板中的指令通常要求处理器在结果树中产生节点,或者与根节点相同的方式,处理来源树中的其它节点。从结果树中取得输出。
xsltproc
,它包含在macOS和许多Linux版本中,在微软Windows系统则透过Cygwin使用。msxsl.exe
。
早期大多数的XSLT处理器都是直译器。近来位元组码越来越普遍,使用可移植的中间语言(如Java位元组码或.NET中间语言)作为目标。然而,即使是直译器的成品通常也提供单独的分析和执行阶段,允许在记忆体中建立优化的表达式树,并可重复使用以执行多重转换。在线上发行应用程序时,这方式有显著的性能优势,其中同样的转换每秒可多次应用在不同的来源档之上。这种分离处理反映在XSLT处理器的应用编程介面(如JAXP)的设计中。
早期XSLT处理器很少被优化过。读取的样式表成为文档物件模型,而XSLT处理器会直接对它们产生作用。XPath引擎也没有被优化过。但是渐增地,XSLT处理器利用了函数式编程和资料库查询语言中发现的优化技术,例如表达式树的静态重写(例如,将计算移出回圈),以及惰性的串流评估来减少过程中所占记忆体的足迹(允许处理器对子表达式求值时,“提早退出”而不必执行全部,例如following-sibling::*[1]
)。许多处理器还使用比一般DOM实作更有效率(在空间和时间上)的树表达式。
2014年6月,Debbie Lockett和Michael Kay推出了一个开放源码的标竿测试框架,名称为XT-Speedo。
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版本。
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>
以下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>
如应用以下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年以来唯一在浏览器之间,有广泛支援的媒体类型。
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.