使用 Scala 作为 XSLT 的替代品?
Posted
技术标签:
【中文标题】使用 Scala 作为 XSLT 的替代品?【英文标题】:Using Scala as a Replacement for XSLT? 【发布时间】:2011-06-24 08:04:12 【问题描述】:在我的 Scala 项目中,我们有很多遗留的 XSLT,并且想知道是否应该将 XSLT 转换为 Scala 代码。
我喜欢将模板应用到节点的 XSLT 方法,并且可以将它用于纯粹的 DOM 转换,但我认为它不太适合处理 XML 文档中的数据(难以阅读和测试) - 我宁愿使用 Scala 来做到这一点。
鉴于 Scala 的内置 XML 支持和模式匹配,我认为它可能是一个很好的替代品。有没有人成功地将 XSLT 脚本转换为 Scala?是否有任何模式或最佳做法?
我知道一个旧项目将 XSLT 转换为 Scala 源代码,名为 XSLT2src,但它已经休眠了很长时间并且不支持 XSLT2。
谢谢
【问题讨论】:
我们有很多生成非 xml 文件的 xslt。用 scalate + scala 替换 xslt 非常简单,并且更容易理解/开发。 我倾向于建议,如果您需要对 XML 文档中的数据进行大量处理,您应该考虑重新设计 XML 的布局。例如,如果你有<data>first, second, third</data>
,那么这应该是<data><item>first</item><item>second</item><item>third</item></data>
。 XML 文件本质上是一个分层数据库,并且适用“任何一个字段只能包含一条数据”的规则。
对于我们使用的XSLT/XML,Scala的XML支持有点欠缺。我们需要更多的 XPath(XML 是由行业标准定义的,所以我们无法更改它)。当 \ 和 \\ 不这样做但失去可读性时,可以通过退回到“正常” Scala 来破解它
【参考方案1】:
如果不确切知道要转换什么 XML 以及如何转换,很难确定,但就目前而言,XSLT 模板/匹配比 Scala XML 模式匹配更强大,更易读,后者存在许多问题。
特别是:
任何重要的匹配要么是不可能的,要么很难做到 不支持命名空间因此,最好从 Scala 调用 Saxon 来执行这些转换。
不过,您可能还想查看 Programming Scala 中的 chapter on XML。
最后,现在流行的观点是 Scala 中的内置 XML 支持在很多方面都缺乏。参见例如Anti-XML 的项目旨在构建更好的东西。
【讨论】:
【参考方案2】:Scales Xml 直接提供命名空间和属性的匹配,但也提供更灵活的内部 dsl 来处理 XPath(以及基于字符串的评估)。
也许最有趣的转换是它能够折叠路径,在 XPath 中选择您想要的内容并转换结果“in place”。这些转换规则可以组合使用。
您仍然可以在 Scales 中直接使用 XPath 复制大部分 xslt 方法,并像在 xslt 中一样转换/构建树。
【讨论】:
以上是关于使用 Scala 作为 XSLT 的替代品?的主要内容,如果未能解决你的问题,请参考以下文章