XSLT值得学习吗?

116
前一阵子,我开始一个项目,在该项目中,我设计了一个类似于HTML的XML模式,以便作者们可以用简化格式编写他们的内容(教育课程资料),然后通过XSLT转换成HTML。我尝试(挣扎)使用它一段时间,并将其达到了非常基本的水平,但是随后我因为遇到的限制感到非常恼火(这些限制可能是我知识的限制),当我读到一篇博客建议放弃XSLT,只需在你选择的语言中编写自己的XML转换器时,我热切地跳上了这条路线,结果效果很好。
我至今仍在继续开发它(实际上我现在应该在工作,而不是在SO上打游戏),我看到越来越多的东西使我认为放弃XSLT是一个明智的决定。
我知道XSLT有其存在的意义,因为它是一个被广泛接受的标准,如果每个人都在编写自己的解析器,其中90%的人最终会出现在TheDailyWTF上。但是,考虑到它是一个函数式语言,而不是大多数程序员熟悉的过程式语言,对于像我这样开始类似项目的人,你会推荐他们走我选择的道路,还是坚持使用XSLT

1
我认为你的问题主题(有争议)和你所问的实际问题(即SO读者是否实际使用XSLT或推荐使用它)之间存在严重脱节。同时也不清楚你为什么需要回答这个问题。 - Martin v. Löwis
3
@Martin,你有什么建议作为标题吗?我并不一定需要这个问题被回答,但我认为它很有趣,并且对于那些正在考虑是否要投资于XSLT或其他替代方案的人来说也很有用。 - Benjol
7
我认为XSLT已经在炒作周期的生产力高原上达到了顶峰。 - Dirk Vollmar
我个人认为,除非我将XML通过至少1或2次转换处理,否则它不会增加任何价值。 - user74754
@Martinv.Löwis,我同意你的看法。此外,这确实归结于企业问题,也就是说,如果同一个人做所有事情,并且方法是创业公司...很好,以最快的实现方式完成它,反正在这种情况下你只是自己搞砸而已。虽然 XSLT 在点击之前相当困难,需要具有领域专业知识,但在大型组织中......我的天啊,您会意识到反对 XML 的所有人是多么错误。此外,一旦您了解了 XSLT,它就是最佳选择,只有在您不了解 XSLT 时才会出现其他情况,因此您需要考虑学习投资。 - J. M. Becker
新时代已经到来,JSON和JavaScript(例如客户端、后端、数据库)的文件转换变得更加易读(还有其他非常好的特性)。 - ddsultan
41个回答

92

太多负面情绪了!

我已经使用XSLT好几年了,真的很喜欢它。你必须认识到的关键是:它不是一种编程语言,而是模板语言(在这方面,我认为它比asp.net/spit更加出色)。

XML是当前Web开发的事实数据格式,无论是配置文件、原始数据还是内存表示。XSLT和XPath为您提供了一个非常强大而高效地将数据转换为任何输出格式的方法,即瞬间为您提供了将演示与数据分离的MVC方面。

然后还有一些实用的功能:清除命名空间、识别不同的模式定义、合并文档。

处理XSLT肯定比开发自己的内部方法好。至少XSLT是一种标准,可以雇用相关人员,如果它真正成为您团队的问题,它的本质也将让您仅仅使用XML就能保持大部分团队工作。

一个真实的用例:我刚刚编写了一个应用程序,整个系统都处理内存中的XML文档,并根据最终用户的请求将其转换为JSON、HTML或XML。我收到了一个相当随意的请求,要求提供Excel数据。以前的同事曾经用程序方式做过类似的事情,但需要使用几个类文件模块和安装MS Office!结果发现,Excel有一个XSD:在3小时内实现最小基础代码影响的新功能。

就我个人而言,我认为这是我职业生涯中遇到的最干净的东西之一,并且我相信它所有表面上的问题(调试、字符串操作、编程结构)都是由于对工具的错误理解造成的。

显然,我强烈认为“值得”。


8
关于调试,针对你所说的一点,Visual Studio最新版本可以直接在XSL文件中进行调试。可以设置断点,检查等操作。 - Craig Bovis
这是一个非常好的答案,尤其是那个清新有趣的 Excel XSD 故事! - Laguna
1
@annakata,你能提供一个关于如何处理Excel的MSDN文章或教程链接吗?我认为这可能是我也可以用于我的项目的东西。谢谢! - Laguna
7
JSON和JAML是比XML更优秀的数据格式。XML本质上是一种标记语言,非常不幸的是它被广泛地错误使用来表示结构化数据。 - ulidtko
3
作为一名系统工程师,我见过很多不合适的JSON标记语言... 我预计会有更多这样的情况出现,这让XML看起来更加出色。 - J. M. Becker
显示剩余4条评论

65

XSLT的优点:

  • 特定于XML领域,因此例如在输出中不需要引用XML字面量。
  • 支持XPath / XQuery,可以很好地查询DOM,就像正则表达式可以很好地查询字符串一样。
  • 函数式语言。

XSLT的缺点:

  • 可能非常冗长 - 您不必引用字面XML,这实际上意味着您必须引用代码。而且不是以简洁的方式。但是,它并不比您典型的SSI(服务器端包含)更糟糕。
  • 不能做大多数程序员认为理所当然的某些事情。例如,字符串操作可能很麻烦。这可能导致新手设计代码时出现“不幸的时刻”,然后疯狂搜索网络以获取有关如何实现他们认为应该存在但没有给自己写时间的函数的提示。
  • 函数式语言。

顺便说一句,获得过程性行为的一种方法是将多个转换链接在一起。每个步骤之后,您都有一个全新的DOM可用于反映该步骤中的更改。一些XSL处理器具有扩展来在一个转换中有效地执行此操作,但我忘记了细节。

因此,如果您的代码主要是输出而不是逻辑,则XSLT可能是表达它的一种非常简洁的方式。如果有很多逻辑,但大多是内置于XSLT中的形式(选择所有看起来像blah的元素,并为每个元素输出blah),那么它很可能是一个相当友好的环境。如果您喜欢始终以XML的方式思考,则可以尝试使用XSLT 2。

否则,我建议,如果您最喜欢的编程语言具有支持XPath并允许您以有用的方式构建文档的良好DOM实现,那么使用XSLT几乎没有什么好处。与libxml2和gdome2的绑定应该很好,坚持您熟悉的通用语言也没有错。

自行编写的XML解析器通常要么不完整(这种情况下,某一天你会遇到困难),要么与市场上的产品规模差不多(这种情况下,你可能在浪费时间),并且会给你带来许多机会,引入关于恶意输入的严重安全问题。除非你确切地知道通过编写自己的XML解析器可以获得什么,否则不要这样做。这并不是说你不能为比XML更简单的输入格式编写解析器,如果你不需要XML所提供的所有功能。


3
XSLT 不是函数式的,它是声明式的(就像 SQL 一样)。 - jmah
一个XSL模板在我看来具备纯函数的所有标准,那么为什么不能称之为函数式的呢?为什么“声明式”是另一种选择?a = 1; 就是声明式的。 - AnthonyWJones
它像Prolog一样是声明式的。http://en.wikipedia.org/wiki/Declarative_programming - Martin York
8
我认为函数式编程是一种声明式编程的类型。 - Zifre
由于XSLT 2.0的出现,您关于缺少功能、功能和字符串处理的观点大多是无效的。它包含完整的正则表达式、替换函数和填补了许多来自XSLT 1.0的空白。 - Abel
1
虽然关于XSLT 2.0的观点是正确的,但即使在我写作的时候,对于XSLT 2.0仍没有广泛的支持。 - PeterAllenWebb

28

我必须承认这里有偏见,因为我以教授XSLT为生。但是,覆盖我看到我的学生正在工作的领域可能会很值得。他们通常分为三个群体:发布、银行和网络。

迄今为止,许多答案可以总结为“它不适合创建网站”或“它与X语言完全不同”。许多技术专业人员在其职业生涯中没有接触过功能/声明性语言。当我教授时,经验丰富的Java/VB/C等人员是那些对语言有问题的人(例如,变量在代数意义上是变量,而不是过程式编程)。这就是许多人在此处回答的情况——我从未使用过Java,但我不会因此而批评这种语言。

在许多情况下,它不是创建网站的适当工具——通用编程语言可能更好。我经常需要将非常大的XML文档呈现在Web上; XSLT使这成为微不足道的事情。在这个领域中,我看到的学生往往在处理数据集并将它们呈现在Web上。 XSLT当然不是这个领域中唯一适用的工具。然而,他们中的许多人正在使用DOM来做这个,而XSLT肯定会减少痛苦。

我看到的银行学生通常使用DataPower框。这是一个XML设备,用于坐在不同XML语言“说话”的服务之间。在XSLT中从一种XML语言转换为另一种几乎是微不足道的,参加我关于此课程的学生数量正在增加。

我看到的最后一组学生来自出版界(就像我一样)。这些人往往拥有巨大的XML文档(相信我,出版业正在非常关注XML——技术出版已经存在多年,现在贸易出版也开始涉足)。这些文档需要处理(DocBook转ePub在这里想到)。

上面有人评论说脚本往往低于60行或变得难以管理。如果它变得难以管理,那么编码人员可能没有真正理解它——XSLT与许多其他语言非常不同。如果您不了解思维方式,它就不起作用。

它绝对不是一门即将消亡的语言(我接到的工作量表明了这一点)。现在,它有些“卡壳”,直到微软完成他们(非常晚期的)XSLT 2实现。但从我的角度来看,它仍然存在并且似乎保持着强劲的发展势头。


我是一名Java开发人员,同时也热爱XML和XSLT。我希望人们能意识到它们的强大之处。 - Nikolas Charalambidis

24

我们广泛使用XSLT来处理文档编写以及让一些复杂的配置设置变得易于用户操作。

对于文档编写,我们大量使用基于XML的DocBook格式。这让我们能够将文档与源代码一起存储和管理,因为这些文件是纯文本的。借助XSLT,我们可以轻松构建自己的文档格式,从而让内容通用自动生成,并使其更易读。例如,在发布版本说明时,我们可以创建类似以下 XML 的内容:

<ReleaseNotes>
    <FixedBugs>
        <Bug id="123" component="Admin">Error when clicking the Foo button</Bug>
        <Bug id="125" component="Core">Crash at startup when configuration is missing</Bug>
        <Bug id="127" component="Admin">Error when clicking the Bar button</Bug>
    </FixedBugs>
</ReleaseNotes>

然后使用XSLT(将上述内容转换为DocBook),我们最终得到了漂亮的发布说明(通常为PDF或HTML),其中bug ID自动链接到我们的bug跟踪器,按组件分组,所有内容格式完全一致。以上XML可以通过查询我们的缺陷跟踪器自动生成,以获取版本间的变化。

我们发现XSLT实际上在我们的核心产品中也很有用。有时候在与第三方系统交互时,我们需要处理复杂HTML页面中的数据。解析HTML很麻烦,因此我们通过类似于TagSoup这样的工具(它生成适当的SAX XML事件,基本上让我们像处理正确编写的XML一样处理HTML),然后我们可以运行一些XSLT来将数据转换为“已知的稳定”格式,以便我们实际处理。通过将转换分离成一个XSLT文件,这意味着如果HTML格式发生更改,应用程序本身不需要升级,而是最终用户可以自己编辑XSLT文件,或者我们可以通过电子邮件向他们发送更新的XSLT文件,而无需整个系统进行升级。

我认为对于Web项目,今天有比XSLT更好的处理视图方面的方法,但是作为一种技术,XSLT肯定有用途。它并不是世界上最容易使用的语言,但它绝对没有“死亡”,从我的角度来看,仍然具有许多良好的用途。


谢谢,这是一个很好的回答,带有具体的例子。 - Benjol
然而,有人觉得有必要对我的回答进行投票评价,却连留下一条评论来指出问题所在都不愿意。 - Adam Batkin
可能是因为他们不同意... - Benjol
有另一个类似于TagSoup的程序,也可以从HTML创建正确的XML树...但我想不起来它的名字了。 有人知道吗? - erjiang
Tidy是一个很好的用于此目的的程序。 - Erlock

19

XSLT是一种声明式编程语言的例子。

其他声明式编程语言的例子包括正则表达式、Prolog和SQL。它们都非常表达力强,简洁紧凑,并且通常设计得非常好,对于它们所设计的任务而言非常强大。

然而,软件开发人员通常不喜欢这些语言,因为它们与主流面向对象或过程化语言非常不同,难以学习和调试。它们的紧凑性通常会让人意外地造成很多损害。

因此,虽然XSLT是将数据合并到演示中的有效机制,但在易用性方面却失败了。我认为这就是它没有真正流行的原因。


2
XSLT是一种功能性语言,但我认为它是否声明性还有待商榷(存在排序依赖等问题)。然而,我同意你的观点,无论是功能性还是声明性都是强大的,也是大多数面向对象/过程式程序员的挑战。然而,在XSLT的情况下,我认为作为一种功能性语言,它缺少了许多使大多数功能性语言可用的特性。因此,通常情况下你需要编写更多的代码,而不是紧凑的代码。例如,你尝试过在XSLT(1.0)中拆分字符串吗? - philsquared
3
顺便说一下,XSLT不是函数式的——它没有将函数作为第一类值。是的,有些技巧可以实现(FXSL),但仅止于此,使用它们时仍无法捕获变量(因此无法使用lambda函数)。XSLT是纯净的(没有副作用),但这并不意味着它是“函数式”的。 - Pavel Minaev
23
和正则表达式一样,XSLT的美在于其概念,而不在于语法。对于那些无法阅读它们的人来说,正则表达式是一个由毫无意义的字母和符号组成的混乱集合。正则表达式之所以美丽,是因为背后的思维方式。 - Tomalak
1
@Tomalak,我同意。我也不喜欢尖括号,但是在其他编程语言中进行一些复杂的树操作时,请尝试一下。这让我想起了温斯顿·丘吉尔关于民主是除了那些已经尝试过的所有其他制度之外最糟糕的制度的名言。 :-) - Bill Karwin
6
@Jeff Atwood,为什么您要对自己明显不了解的领域发表如此绝对的言论?XSLT和XPath确实具有良好的正则表达式功能,并且这些功能已经被用于SO上的问题答案中。我曾使用XSLT中的正则表达式编写过一个以上的解析器,用于词法分析。其中最复杂的解析器是针对XPath 2.0的。像楚克奇人笑话中那样,先写后读是不可取的。 - Dimitre Novatchev
显示剩余2条评论

12

我还记得当XSLT标准刚发布时,围绕它的所有炒作。人们对于能够使用“简单”的转换构建整个HTML界面感到兴奋。

不可否认,XSLT难以使用、几乎无法调试,并且通常运行缓慢。最终结果几乎总是古怪的,不太理想。

在有更好的方法可以解决问题时,我宁愿啃掉自己的腿,也不会使用XSLT。尽管如此,XSLT仍有其适用的场合,适用于简单的转换任务。


1
速度极慢?与什么相比较呢? - AnthonyWJones
与我以前手写VB6转换相比,这种方法快了几个数量级。当时我正在将ADO Recordsets转换为HTML,而使用XSLT转换则要慢得多(大约是在2002年)。 - endian
3
使用 Oxygen 等工具进行调试比你想象的要容易得多。 - Andy Dent

10

我广泛使用了XSLT(以及XQuery)处理各种内容 - 例如在构建过程中生成C ++代码,从文档注释生成文档,以及在一个需要大量使用XML和特定的XHTML应用程序中。特别是代码生成器超过10,000行XSLT 2.0代码分布在大约十几个不同的文件中(它做了很多事情 - 为客户端生成头文件、远程代理/存根、COM包装器、.NET包装器、ORM等)。我接手这个项目之前有个人对语言不太了解,所以旧代码非常混乱。我们编写的新代码大多保持了可读性,我没有回忆起任何特别困难的问题。这肯定不比使用C++更难。

说到版本,使用XSLT 2.0确实有助于保持清醒,但1.0仍适用于简单的转换。在其领域中,它是一种非常方便的工具,并且通过某些特定领域功能(最重要的是模板匹配动态分派)获得的生产力难以匹敌。尽管XSLT的基于XML的语法看起来有点啰嗦,但使用LINQ to XML(即使是VB和XML文字)完成同样的事通常需要几倍的代码。然而,由于一些不必要情况下过度使用XML,它经常受到不应得的批评。

总之:它是一个非常有用的工具,但它是一个非常专业化的工具,因此只要您正确使用并用于其预期目的,就是好的。我真的希望有一个合适的、本地的.NET实现XSLT 2.0。


9
我使用XSLT(因为没有更好的替代方案),但不是用于演示,而是用于转换:
  1. 我编写简短的XSLT转换来对我们的maven pom.xml文件进行批量编辑。

  2. 我编写了一系列转换流程,从XMI(UML图)生成XML模式。它一直有效,但最终变得过于复杂,我们不得不放弃它。

  3. 我使用转换来重构XML模式。

  4. 我通过使用它生成一个XSLT来解决XSLT中的一些限制以执行实际工作。(尝试过编写一个使用运行时未知命名空间生成输出的XSLT吗?)

我一直回到它,因为它在处理的XML往返过程中做得比我尝试过的其他方法更好,这些方法似乎不必要地损失了或者仅仅是误解了XML。 XSLT很不愉快,但我发现使用Oxygen让它变得可接受。

话虽如此,我正在研究使用Clojure(一种Lisp语言)来对XML进行转换,但我还没有进展到知道这种方法是否会给我带来好处。


XSLT让我不用用hackish shell脚本来修改POM。我已经接受了XML的存在,虽然它很糟糕...但是在标记方面没有比它更好的了。XSLT也很糟糕,但是它是从XML转换到任何格式的最佳方式。XQuery很酷,但不是解决那些混乱的XML堆积并将其转化为有组织的XML意义集的最佳方式。 - J. M. Becker

7
个人而言,我在完全不同的背景下使用了XSLT。当时我正在开发的电脑游戏使用了大量使用XML定义的UI页面。在发布后的一次重构中,我们希望更改这些XML文档的结构。我们使游戏的输入格式遵循了一个更好且具有模式感知能力的结构。
XSLT似乎是从旧格式转换为新格式的完美选择。在两周内,我就实现了对数百个页面的从旧到新的转换。我还能够使用它提取我们的UI页面布局的大量信息。我相对容易地创建了嵌入在哪个组件中的列表,然后使用XSLT将其写入我们的模式定义中。
此外,作为一个来自C++背景的人,它是一种非常有趣和有趣的语言。
我认为,作为将XML从一种格式转换为另一种格式的工具,它非常棒。但是,如果您的算法足够复杂,则输入为XML的事实对于您选择的工具变得无关紧要 - 例如在C ++ / Python /任何其他语言中编写自己的算法。
针对您的示例,我想最好的方法是创建自己的XML-> XML转换器,遵循您的业务逻辑。接下来,编写一个只知道格式化的XSLT翻译器,不做任何聪明的事情。这可能是一个不错的折中方案,但完全取决于您正在做什么。在输出上使用XSLT翻译器可以更容易地创建替代输出格式 - 可打印的,适用于移动设备等。

6

是的,我经常使用它。通过使用不同的xslt文件,我可以使用相同的XML源创建多个多语言(X)HTML文件(以不同的方式呈现相同的数据),RSS提要,Atom提要,RDF描述符文件和站点地图片段。

它并不是万能药。它有擅长的事情和不擅长的事情,就像编程的其他方面一样,关键在于选择合适的工具来完成合适的工作。这是一个非常值得拥有的工具,但只有在适当的时候才应该使用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接