计算机科学

首页 > 计算机科学

XSLT

2018-09-06 14:13:47     所属分类:置标语言
XSL转换进程示意图

在计算机科学中,可扩展样式表转换语言英语: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是一种图灵完备的语言,它可以指定计算机能运行的任何计算。

目录

  • 1 历史
  • 2 设计模型与处理
  • 3 处理器实现
    • 3.1 性能
  • 4 XPath
  • 5 与 XQuery 比较
  • 6 媒体类型
  • 7 示例
    • 7.1 例一(从XSL转换为XML)
    • 7.2 例二(从XML转换为XHTML)
  • 8 参考文献
  • 9 外部链接
  • 10 参见

历史

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/xmlapplication/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会产生如下的输出。

Rendered XHTML generated from an XML input file and an XSLT transformation.

为了使网络浏览器能够自动将XSL转换应用于显示的XML文档,XML的样式表处理指令可插入XML中。因此若上例二中的样式表为“example2.xsl”,则以下指令将把它添加到原来输入的XML中:

<?xml-stylesheet href="example2.xsl" type="text/xsl" ?>

本示例中,根据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
版权声明:本文由北城百科网创作,转载请联系管理获取授权,未经容许转载必究。https://www.beichengjiu.com/computerscience/340700.html

显示全文

取消

感谢您的支持,我会继续努力的!

扫码支持
支付宝扫一扫赏金或者微信支付5毛钱,阅读全文

打开微信扫一扫,即可进行阅读全文哦


上一篇:Bencode
下一篇:GPX
相关推荐
爱淘宝