用于转换结构的XSLT +用于转换值的Ruby?

时间:2009-12-22 17:26:28

标签: xml ruby xslt

我们有来自不同来源的相当大的(~200mb)xml文件,我们希望将其转换为通用格式。

对于结构转换(元素名称,嵌套等),我们决定使用XSLT(1.0)。因为它必须很快(我们收到很多这些文件),所以我们选择Apache Xalan作为引擎。结构转换可能非常复杂(不仅仅是<tag a> -> <tag b>),而且来自不同来源的xml文件也不同。

但是,我们还需要转换元素的值。转换可能相当复杂(即,一些需要访问Google Maps API,其他人需要访问我们的数据库等...),所以我们决定使用一个简单的基于Ruby的DSL,这是一个“xpath选择器”列表=&GT;变压器实体,即:

{"rss/channel/item" => {:class => 'ItemMutators', :method => :guess_location}

然而,保持元素转换与值转换不同似乎是一种黑客攻击。有没有更好的解决方案?


例如,使用Java,您可以为xalan编写扩展,并且可以使用它们来转换值。 是否有类似的东西,但红宝石?


谢谢你们,伙计们! 所有回复都非常有价值。我目前在想:)

3 个答案:

答案 0 :(得分:2)

答案 1 :(得分:2)

您应该能够使用XSLT扩展。网络搜索显示Xalan支持Java进行扩展:http://xml.apache.org/xalan-j/extensions.html

来自链接页面的引用:

  

对于那些你想要的情况   喜欢增强功能   XSLT调用程序   语言,Xalan-Java支持   创建和使用扩展元素   和扩展功能。 Xalan的Java的   还提供了不断增长的扩展   库可供您使用。

另外,显然有人在Ruby中编写了一个可以提供xslt扩展的包:http://greg.rubyfr.net/pub/packages/ruby-xslt/classes/XML/XSLT.html

答案 2 :(得分:1)

一种方法是使用Xalan-J和一些扩展,使RPC调用回Ruby进程。返回的数据可以由XSLT进一步处理。

为了实现更紧密的集成,您可以将Xalan-C ++绑定为Ruby 图书馆。您可能只需要Xalan API的一小部分,类似于命令行驱动程序XalanExe中使用的部分。随着Xalan在进程中运行,您的扩展就可以了 直接访问你的Ruby模型。

链接: