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个回答

4

3

XSLT很难使用,但一旦掌握它,您将对DOM和模式有非常深入的了解。如果您还了解XPath,那么您就在学习函数式编程的路上了,这将向您展示解决问题的新技术和方法。在某些情况下,连续转换比过程化解决方案更强大。


当你编写自己的自定义转换代码时,你会对xpath和DOM有很好的理解。其中包括但不限于:调整图像大小、从XML生成JavaScript、从文件系统读取以生成导航等许多事情。 - nickf

3

我广泛使用XSLT,用于自定义MVC风格的前端。模型通过XML(不是通过XML序列化)“序列化”,然后通过XSLT转换为HTML。与ASP.NET相比,优势在于与XPath的自然集成以及更严格的格式要求(在XSLT中比大多数其他语言更容易推理文档结构)。

不幸的是,该语言包含几个限制(例如,无法转换另一个转换的输出),这意味着有时会让人感到沮丧。

尽管如此,它提供的易于实现、强制执行的关注点分离是我目前没有看到其他技术能够提供的 - 因此对于文档转换,它仍然是我推荐的东西。


3
在2004年的一次系统集成项目中,我使用了XML、XSD和XSLT。虽然我不得不从零开始学习XSD和XSLT,但并不难。这些工具的好处是,它使我能够编写与数据独立的C ++代码,依靠XSD和XSLT验证/验证,然后转换XML文档。更改数据格式,更改XSD和XSLT文档,而不是使用Xerces库的C++代码。
有趣的是:主要的XSD大小为150KB,平均XSLT大小为< 5KB,如果我没记错的话。
另一个巨大的好处是,XSD是XSLT基于其上的规范文档。两者协同工作。在软件开发中,规范文件很少见。
虽然我学习声明性XSD和XSLT并没有遇到太多麻烦,但我发现其他C/C++程序员很难适应这种声明性方式。当他们看到那就是它,啊,过程式的,他们喃喃自语,现在我明白了!他们然后(双关语?)编写过程式XSLT!你必须学习XPath并理解XML的轴。这使我想起早期的C程序员在编写C++时调整以采用OO的情况。
我使用这些工具,因为它们使我能够编写一个小的C++代码库,该库与除最基本的数据结构修改外的所有内容隔离开来,而这些修改是DB结构更改。即使我更喜欢C++而不是其他语言,但我会使用我认为对软件项目的长期可持续性有用的东西。

3

我曾认为XSLT是个好主意。我的意思是,它确实是个好主意。

但它的执行却失败了。

随着时间的推移,我发现编程语言在XML中只是一个糟糕的想法。它使整个过程变得晦涩难懂。具体来说,我认为XSLT非常难学、难编码和难理解。在功能方面加上XML只会让整个过程更加混乱。在我的职业生涯中,我尝试过5次去学习它,但它就是不灵。

好吧,你可以“工具化”它——我认为这部分是它设计的一部分——但这是第二个失败:市场上所有的XSLT工具都很简单... 烂!


1
在我看来,你刚刚描述的是你自己在使用XSLT时遇到的问题,而不是语言本身存在的问题。我得说,你可能正在使用错误的工具 :) - Nic Gibson

3
我发现XSLT很难使用。
我曾经在一个与你描述的系统有些相似的系统上工作过。我的公司注意到我们从“中间层”返回的数据是XML格式的,而页面将以HTML(实际上可能是XHTML)呈现,他们也听说XSL是在XML格式之间进行转换的标准。因此,“架构师”(我指思考深入设计思想但显然从不编码的人)决定我们的前端应该通过编写XSLT脚本来将数据转换为用于显示的XHTML。
选择结果灾难性。原来,编写XSLT非常困难。因此,我们所有的页面都很难编写和维护。我们最好使用JSP(这是在Java中)或使用一种类似的方法,该方法使用一种标记(角括号)用于输出格式(HTML),并使用另一种标记(如<%...%>)用于元数据。 XSLT最令人困惑的事情是它是用XML编写的,并且从XML翻译成XML……让人很难在头脑中保持所有3个不同的XML文档。
您的情况略有不同:与我一样,您不需要在XSLT中编写每个页面,而只需要编写一个XSLT代码片段(用于将模板转换为显示)。但是,听起来您可能遇到了我遇到的同样困难。我会说,尝试解释一个简单的基于XML的DSL(领域特定语言)并不是XSLT的强项。(尽管它可以做到…毕竟,它是图灵完备的!)
但是,如果您拥有更简单的东西:您拥有一个XML格式的数据,并希望对其进行简单修改——不是完整的页面描述DSL,而是一些简单直接的修改,则XSLT是实现该目的的优秀工具。它的声明性(而不是过程性)本质实际上是这个目的的优势。
-- Michael Chermside

2
如果你能以声明式风格使用XSLT(尽管我不完全认同它是一种声明式语言),那么我认为它非常有用和表达力强。
我曾经编写过使用面向对象语言(我的情况下是C#)处理数据/处理层的Web应用程序,但输出的是XML而不是HTML。这可以直接作为数据API被客户端消费,或者通过XSLT呈现为HTML。因为C#输出的XML与此类使用的结构兼容,所以整个过程非常平滑,呈现逻辑也保持了声明性。比起从C#发送标签,这样做更易于跟踪和更改。
然而,随着你在XSLT级别上需要更多的处理逻辑,即使你“理解”函数式风格,它也会变得复杂和冗长。
当然,如今我可能会使用RESTful接口编写这些Web应用程序 - 我认为像JSON这样的数据“语言”正在获得传统上由XSLT转换的XML领域的支持。但就目前而言,XSLT仍然是一项重要且有用的技术。

2

XSLT规范将XSLT定义为“一种将XML文档转换为其他XML文档的语言”。如果您想在XSLT中进行除最基本数据处理之外的任何操作,可能有更好的解决方案。

值得注意的是,可以使用自定义扩展函数在.NET中扩展XSLT的数据处理能力:


1
将标准语言扩展到非标准扩展是最糟糕的事情。最终得到的既不是XSLT也不是CLR代码。 - Piotr Dobrogost
公平,但这并不意味着它有时不会有用。 - Eric Schoonover

2

我仍然相信XSLT可以很有用,但它是一种丑陋的语言,可能会导致难以阅读、难以维护的混乱。这部分原因在于XML不够人类可读,无法构成“语言”,另一部分原因则在于XSLT处于声明性和过程性之间的某个位置。话虽如此,我认为可以将其与正则表达式进行比较,在处理简单而明确定义的问题时有其用途。

使用替代方法并在代码中解析XML同样麻烦,您真的希望采用某种XML marshalling/binding技术(例如Java中的JiBX),将您的XML直接转换为对象。


2
我为公司维护一个在线文档系统。撰写人员使用SGML(类似于XML的语言)编写文档。然后将SGML与XSLT结合并转换成HTML。
这使我们能够轻松地更改文档布局,而无需进行任何编码。只需要更改XSLT即可。
在我们的情况下,这对我们很有效。在我们的案例中,这是只读文档。用户不与文档进行交互。
此外,通过使用XSLT,您更接近问题域(HTML)。我始终认为这是一个好主意。
最后,如果您当前的系统有效,请不要更改它。我永远不会建议丢弃现有的代码。如果我从头开始,我会使用XSLT,但在您的情况下,我会使用现有的代码。

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