我至今仍在继续开发它(实际上我现在应该在工作,而不是在SO上打游戏),我看到越来越多的东西使我认为放弃XSLT是一个明智的决定。
我知道XSLT有其存在的意义,因为它是一个被广泛接受的标准,如果每个人都在编写自己的解析器,其中90%的人最终会出现在TheDailyWTF上。但是,考虑到它是一个函数式语言,而不是大多数程序员熟悉的过程式语言,对于像我这样开始类似项目的人,你会推荐他们走我选择的道路,还是坚持使用XSLT?
太多负面情绪了!
我已经使用XSLT好几年了,真的很喜欢它。你必须认识到的关键是:它不是一种编程语言,而是模板语言(在这方面,我认为它比asp.net/spit更加出色)。
XML是当前Web开发的事实数据格式,无论是配置文件、原始数据还是内存表示。XSLT和XPath为您提供了一个非常强大而高效地将数据转换为任何输出格式的方法,即瞬间为您提供了将演示与数据分离的MVC方面。
然后还有一些实用的功能:清除命名空间、识别不同的模式定义、合并文档。
处理XSLT肯定比开发自己的内部方法好。至少XSLT是一种标准,可以雇用相关人员,如果它真正成为您团队的问题,它的本质也将让您仅仅使用XML就能保持大部分团队工作。
一个真实的用例:我刚刚编写了一个应用程序,整个系统都处理内存中的XML文档,并根据最终用户的请求将其转换为JSON、HTML或XML。我收到了一个相当随意的请求,要求提供Excel数据。以前的同事曾经用程序方式做过类似的事情,但需要使用几个类文件模块和安装MS Office!结果发现,Excel有一个XSD:在3小时内实现最小基础代码影响的新功能。
就我个人而言,我认为这是我职业生涯中遇到的最干净的东西之一,并且我相信它所有表面上的问题(调试、字符串操作、编程结构)都是由于对工具的错误理解造成的。
显然,我强烈认为“值得”。
XSLT的优点:
XSLT的缺点:
顺便说一句,获得过程性行为的一种方法是将多个转换链接在一起。每个步骤之后,您都有一个全新的DOM可用于反映该步骤中的更改。一些XSL处理器具有扩展来在一个转换中有效地执行此操作,但我忘记了细节。
因此,如果您的代码主要是输出而不是逻辑,则XSLT可能是表达它的一种非常简洁的方式。如果有很多逻辑,但大多是内置于XSLT中的形式(选择所有看起来像blah的元素,并为每个元素输出blah),那么它很可能是一个相当友好的环境。如果您喜欢始终以XML的方式思考,则可以尝试使用XSLT 2。
否则,我建议,如果您最喜欢的编程语言具有支持XPath并允许您以有用的方式构建文档的良好DOM实现,那么使用XSLT几乎没有什么好处。与libxml2和gdome2的绑定应该很好,坚持您熟悉的通用语言也没有错。
自行编写的XML解析器通常要么不完整(这种情况下,某一天你会遇到困难),要么与市场上的产品规模差不多(这种情况下,你可能在浪费时间),并且会给你带来许多机会,引入关于恶意输入的严重安全问题。除非你确切地知道通过编写自己的XML解析器可以获得什么,否则不要这样做。这并不是说你不能为比XML更简单的输入格式编写解析器,如果你不需要XML所提供的所有功能。
我必须承认这里有偏见,因为我以教授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实现。但从我的角度来看,它仍然存在并且似乎保持着强劲的发展势头。
我们广泛使用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肯定有用途。它并不是世界上最容易使用的语言,但它绝对没有“死亡”,从我的角度来看,仍然具有许多良好的用途。
XSLT是一种声明式编程语言的例子。
其他声明式编程语言的例子包括正则表达式、Prolog和SQL。它们都非常表达力强,简洁紧凑,并且通常设计得非常好,对于它们所设计的任务而言非常强大。
然而,软件开发人员通常不喜欢这些语言,因为它们与主流面向对象或过程化语言非常不同,难以学习和调试。它们的紧凑性通常会让人意外地造成很多损害。
因此,虽然XSLT是将数据合并到演示中的有效机制,但在易用性方面却失败了。我认为这就是它没有真正流行的原因。
我还记得当XSLT标准刚发布时,围绕它的所有炒作。人们对于能够使用“简单”的转换构建整个HTML界面感到兴奋。
不可否认,XSLT难以使用、几乎无法调试,并且通常运行缓慢。最终结果几乎总是古怪的,不太理想。
在有更好的方法可以解决问题时,我宁愿啃掉自己的腿,也不会使用XSLT。尽管如此,XSLT仍有其适用的场合,适用于简单的转换任务。
我广泛使用了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。
我编写简短的XSLT转换来对我们的maven pom.xml文件进行批量编辑。
我编写了一系列转换流程,从XMI(UML图)生成XML模式。它一直有效,但最终变得过于复杂,我们不得不放弃它。
我使用转换来重构XML模式。
我通过使用它生成一个XSLT来解决XSLT中的一些限制以执行实际工作。(尝试过编写一个使用运行时未知命名空间生成输出的XSLT吗?)
我一直回到它,因为它在处理的XML往返过程中做得比我尝试过的其他方法更好,这些方法似乎不必要地损失了或者仅仅是误解了XML。 XSLT很不愉快,但我发现使用Oxygen让它变得可接受。
话虽如此,我正在研究使用Clojure(一种Lisp语言)来对XML进行转换,但我还没有进展到知道这种方法是否会给我带来好处。
是的,我经常使用它。通过使用不同的xslt文件,我可以使用相同的XML源创建多个多语言(X)HTML文件(以不同的方式呈现相同的数据),RSS提要,Atom提要,RDF描述符文件和站点地图片段。
它并不是万能药。它有擅长的事情和不擅长的事情,就像编程的其他方面一样,关键在于选择合适的工具来完成合适的工作。这是一个非常值得拥有的工具,但只有在适当的时候才应该使用它。