XSLT 何时是定义 XML 转换而不是使用像 Python 这样的脚本语言的合适解决方案?
7 回答
如果您不想考虑开发人员熟悉度之类的问题,我几乎总是会说,假设您拥有 XSLT 2.0 或至少是 EXSLT,因为 XSLT 1.0 非常有限(如果您只需要结构转换,1.0 就足够了,但如果您需要对内容做任何事情,你要远离 1.0)。XSLT 专为转换 XML 而设计,我发现它比通用编程语言中的 XML 库更适合该任务。
当然,这一切都假设您只需要将输入的 XML 转换为其他形式。在现实世界中,需求会发生变化,突然之间,您不仅要转换 XML,还要基于它执行一些操作。尽管 XSLT 是图灵完备的,但它并不是一种真正的通用编程语言,因此为了适应未来,使用另一种语言可能更安全。不过,我可能会在 XSLT 中实现第一个版本,因为我发现它更快、更容易理解,并且只有当 XSLT 后来证明不合适时,我才会考虑其他东西。
这主要与 XML 作为一种分层树型数据结构有关。
您可以将操作设置为在某些模式在 XML 文件树中出现的任何位置匹配时发生。
您还可以级联转换,以便根据树上更远的先前操作应用/忽略某些转换。
如果您的 XML 数据相对平坦,并且标记 of<X>
在任何地方都表示相同的东西,那么优势就不是那么明显了,但是如果<X>
在根部表示一件事,在 a 中表示不同的东西<Y>
,如果在 a<Z>
之后的 a中表示另一件事,<y>
那么 XSLT 就变成了容易得多。
有很多重叠。
- 如果您指定的模板规则数量少于使用代码递归定义相同行为所需的数量,那么 XSLT 就有意义了。
- 如果长期维护规则的人比 XML/XSLT 更熟悉和熟悉(或有更好的工具来支持)代码,那么代码是更好的选择。
- 如果您希望能够支持大规模并行性以获得更好的性能,那么 XSLT(或像 F# 这样的函数式语言)可能是要走的路,尽管现在可能实际上不可用(尽管将来应该)。
我发现 XSLT 对于简单的工作非常有用,而且它也是独立于平台的(XSLT 内置于许多语言中)。但是我发现它不容易扩展,而且由于我还需要进行特定于域的计算,因此以递归函数方式编写正常操作非常繁琐。
此外,XSLT2.0 对于分组等操作确实是必需的(没有它,您必须记住 Muenchian 方法,它很聪明但不直观)。然而,并非所有系统都支持 XSLT2.0。
在性能方面,一些 XSL 处理器在运行之前将转换编译为二进制。如果转换将被多次使用,那将是一个很大的性能优势。
马上,如果您要将 XML 转换为 HTML、XML 或文本以外的任何内容,那么您不应该使用 XSLT。
除此之外,我已经使用 XSLT 完成了大量工作,但我还没有遇到过使用 XSLT 转换 XML 并发现自己希望选择其他东西的情况。和 jk 一样,我的回答是“几乎总是”。
如果您或与您一起工作的人更喜欢 XSLT,或者如果您可以从使用 XSLT 中获得一些技术优势(例如,将 XSLT 集成到 Cocoon 中),那么请使用 XSLT。否则,它几乎总是比你想象的更痛苦。使用 Python(使用 lxml)、Ruby(使用 rexml)甚至 PHP(使用 SimpleXML)之类的语言会更快乐。您甚至可以将它与模板库(如 genshi,与 Python)配对,以使工作更加轻松。
我自己采用了这两种方法,我相信从长远来看,使用 XSLT 以外的东西会让您更快乐。