XSLT和可能的替代品


15

我看过XSLT,它可以将一个XML文件转换为另一个XML文件(HTML等)。现在,尽管我看到XSLT(作为一种标准化且使用过的工具)有很多好处,但出于以下几个原因,我还是不愿意

  • XSLT处理器似乎非常庞大/资源匮乏
  • XML对于编程来说是一个糟糕的表示法,这就是XSLT的全部含义。

它不想在这里拖拉XSLT,尽管我只是想指出我不喜欢XSLT的原因,以使您了解我对替代产品的期望。

有一些Lisp背景知识,我想知道是否有一些基于Lisp的树结构转换的更好方法。我看到过对DSSSL的引用,可悲的是,大多数关于DSSSL的链接都已失效,因此查看一些说明它的代码已经具有挑战性。是否仍在使用DSSSL?我记得在签出docbook内容时我曾经安装过openjade。

Jeff Atwood的博客文章似乎暗示使用Ruby而不是XSLT。

在非xml编程语言中,是否有任何明智的方式来进行类似于XSLT的XML转换?我愿意接受输入

  • 有用的脚本语言库,可促进XML转换
  • 特别是(但不限于)类似Lisp的转换语言或Ruby等。

到目前为止,我发现了一些东西:


我经常使用HXT和Haskell,这非常令人愉快
Daniel Gratzer

5
公平地说,提倡Ruby的不是Jeff Atwood,而是他引用了更喜欢Ruby的Martin Fowler。Fowler的原始帖子在这里:martinfowler.com/bliki/MovingAwayFromXslt.html它写于10年前的2003年-我认为XSLT 2.0于2007年问世,并进行了许多改进,而XPath 2.0则在2010
。– FrustratedWithFormsDesigner

Answers:


18

如果您没有丰富的技术经验,则很难评估技术,但是当然,这恰恰是您必须做出决定时所用的,因此,对于这一难题,没有简单的答案。

您列举了两个问题:性能和可用性。我会在下面同时解决。

首先,性能。当然,性能不仅取决于语言,还取决于实现方式以及用户的专业知识。不同的XSLT处理器的性能差异很大,而同一处理器的使用方式也可能差异很大(例如,对于Saxon,经常遇到性能问题的人将其与DOM一起使用,这是一个很差的组合) ,如果改用Saxon的本地树模型,性能可以提高十倍)。因此,第一个建议是不要对传闻进行考核,而要对其进行衡量。第二个建议是确保进行测量的人员具有足够的经验,不要犯愚蠢的错误。说起来容易做起来难。

可以粗略地将转换作业分为两类:简单和复杂。对于简单的转换,使用好的XSLT处理器,所有的时间都花在了解析和序列化上,而XSLT的处理时间几乎没有花时间。由于任何其他技术都将产生相同的解析和序列化成本,因此转换技术的选择不会产生太大的变化(除了非常非常低的使用流编码的编码,但没有多少人负担得起编程的费用)实施所需的时间和技能)。对于大型文档的复杂转换,您开始遇到与SQL编程相同的问题:要获得良好的性能,就需要程序员的技能和知识以及优化程序的功能之间进行良好的交互。与SQL一样,用这种高级语言编写一些简单的语句非常容易,这导致处理器不得不做大量的工作。而且与SQL一样,知道自己在做什么的程序员会比新手做得更好。

第二,可用性。XSLT的基于XML的语法在许多初次接触该语言的人中是非常讨厌的。但是这样做有充分的理由和真正的好处:有一个“模板”参数,很多代码都包含要写入结果文档中的XML,而编写XML的最佳方法是使用XML。还有“反射”的论点。在大型复杂系统中,通常会找到生成样式表的样式表。然后是“工具”参数;如果您在XML商店中,则可能有很多XML工具,例如语法导向的编辑器,并且能够使用相同的工具来处理您的程序和数据是很好的。相比之下,这些缺点显得很漂亮:编辑中涉及的击键次数(使用好的编辑工具即可轻松解决),并且代码过于冗长(降低了可读性)。通过引入诸如正则表达式和样式表功能之类的功能,XSLT 2.0中的冗长性已大大降低:当许多样式表充分利用XSLT 2.0时,它们的大小将减小为一半或三分之一。

您对DSSSL的提及使我面带微笑。我从来没有使用过DSSSL,但是我听到的故事是它不成功,因为它的语法很神秘,并且与数据(SGML)的语法无关。DSS的使用经验强烈推动了XSLT使用XML语法。

有些人喜欢XSLT,有些人讨厌它。毫不奇怪,经常使用它的人往往属于第一类。那些不喜欢它的人通常是那些还没有学会“思考XSLT方式”的人。您可能会争辩说,编程语言不应该影响您的思维方式,但是会影响:使用基于规则的语言编写的代码与使用命令式语言编写的代码具有不同的思维方式。许多程序员的第一反应是他们感觉不到控制权(描述问题,而不是告诉计算机逐步执行的操作)。这与您第一次向人们介绍SQL时曾经看到的反应非常相似。如今,人们在职业生涯中较早地学习SQL,因此不需要进行精神上的调整。

最终,您应该基于客观的可衡量标准而不是基于爱/恨反应来选择一种技术。进行这些测量很困难。但是有很多人非常密集且非常成功地使用XSLT,因此毫无疑问可以做到这一点。


2
“基于规则的语言”的更常见术语是声明性语言。
Daniel Gratzer 2013年

@Michael Kay-好了。我个人喜欢XSLT并将其与C#一起使用。另外,我将它与XSL-FO一起使用以生成PDF文档。XSLT非常强大,非常强大,使我能够将大量数据快速转换为HTML,XSL-FO,XML或Text。
PhillyNJ

3

没有有关上下文的其他信息,很难回答。

不过,我仍然不明白为什么您不想使用XSLT。这是完成这项工作的正确工具,而且功能强大。专门完成了将一种XML转换为另一种XML的工作。

XSLT处理器似乎非常庞大/资源匮乏

您是否有可靠的数据来支持这一点?您是否使用XSLT实施了该解决方案,并发现XSLT 瓶颈,因此在满足与性能有关的所有非功能性要求的同时,也无法交付产品?

没有统计数据和分析,您将无法合理地断言给定的解决方案将无法工作。非功能性要求是否足够合理?您是否愿意浪费10天的开发人员的工作来通过用另一种替代XSLT来获取数百毫秒的时间?值得吗?

XML对于编程来说是一个糟糕的表示法,这就是XSLT的全部含义。

因此,您想将一种XML转换为另一种XML,但又不想使用XSLT,因为“ XML是错误的表示法”吗?

如果事实是您将XML用作一种使您非常烦恼的编程语言,则不要将XML视为编程,而是一堆转换规则。

您甚至不需要手动编写XSLT。有大量的ETL编辑器可以让您将一种XML图形化地映射到另一种XML:不需要任何编程。其中一些使用XSLT作为输​​出。


我在使用基于XSLT的工作表时遇到了资源问题,它们是使用图形工具创建的,但是它停止使用较大的文件。
wirrbel 2013年

1
那么可能XSLT file不是您XSLT Transformations自己就有问题
Malachi 2013年

现在我不谴责XML,实际上我认为它适合于数据表示(尤其是用于标记)。作为一种“编程语言”-XSLT是特定于域的编程语言-不方便。<xsl:whatever>查询属性中的标记,元语言(如xpath,$表示法等),所有未映射到XML的内容都放在属性引号中。对于XML的S表达式表示形式的印象:blog.getprismatic.com/blog/2013/1/22/…XML和proglang可以这么远地工作

1

如果使用XSLT基于原始XSLT和传递给XSLT引擎的某些参数生成XML,则使用模板XML方法更容易理解和维护。

我在一个项目中,使用Mustache代替XSLT,结果是每个人都可以编辑和调整的更简单的基本XML文件,而不是将该项目工作传递给一个或两个勇敢的灵魂,而他们全然沉默汗珠涌出...

当基本XML本身也是有效数据,并且使用XSLT提供替代表示形式或从源XML提取数据时,则不适合使用模板方法。


您介意进一步解释它的作用,为什么在回答所提出的问题时推荐它?在Stack Exchange上不太欢迎“仅链接的答案”
-gnat

1
与您的反馈一致的已审核答案
Michael Shaw

0

XML不是编程语言

XML是一种传输/传输数据的方式。
XSLT指令的作用是使用Xpath以特定方式查询数据并将其放入另一个数据传输对象/文档中。

与/或

XSLT可以将XML转换为HTML,这是另一种显示/传输XML文档中包含的数据的方式。

如果您要更改XML或创建XML文档,则可以使用多种语言:C#,VB,Ruby,Etc。

通常,当您使用XSLT文件转换XML文档时,您仍然拥有原始XML文档,您实际上并没有更改原始文档,而是真正创建了一个新XML文档。


1
维基百科说:“ XSLT是一种图灵完备的语言,这意味着它可以指定计算机可以执行的任何计算。” 我从未说过XML本身就是一种编程语言。
wirrbel 2013年

您说过,在我使用的编程语言中,“ XML是编程的错误表示法”可以很容易地从XML文件中提取数据。XSLT在能够进行大量计算并将该数据分散到另一个数据传输对象/文档方面获得了发展。就像从SQL到SQL Server一样,它可以做很多事情,但主要是后端,而不是前端。像XSLT这样的SQL,它以特定的方式查询数据,但是您永远不想将查询的结果作为报表提供,您希望将信息发送给报表生成器
Malachi

2
XSLT不查询数据,XPATH进行查询。XSLT是不是一种在已解析的xml上定义指令的声明性语言吗?
PhillyNJ 2013年

XSLT基于可以使用Xpath的模式定义转换规则。即你可以有高水平的编程结构,例如xsl:for-each xsl:apply-templatesxsl:if xsl:call-template xsl:value-of定义转换规则。
wirrbel 2013年

1
@PhilVallone我同意。我错了。wirrbel,关于XSLT / XSL是什么,不是XSLT / XSL,我不会与您争论。如果要将XML文档转换为另一个XML Document,您将要使用XSLT / XSL。
玛拉基2013年

0

我曾在多个XML处理系统上进行过工作,这些系统将XSLT库与Java或C ++结合在一起,以解决XSLT不擅长的部分。有些库甚至在20 MB的XML文件上也具有很好的XSLT性能,但是XSLT在上下文,变量和真正复杂的字符串模式方面有一些限制。我使用的每个系统都有一些用Java / C ++完成的事情,因为上下文很重要或某些复杂的正则表达式表达有所帮助。我的收获是,XSLT加上您选择的语言中的一些其他代码是转换XML的好方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.