XSLT作为构建器/工厂

时间:2011-06-29 19:54:30

标签: templates xslt factory builder

有没有办法滥用XSLT作为对象的构建器/工厂而不是生成文本输出?单独的XPath-epressions非常适合查询简单的东西,但在我在XSLT中使用递归的情况下会变得单调乏味。

换句话说,我想使用XSLT的模板匹配语义,但每个模板都会构造并返回一个对象而不是一个节点或文本。

用例是实现模型转换器,其中目标模型不是某些XML内容,而是自定义域模型(作为内存中的对象图)。

2 个答案:

答案 0 :(得分:2)

有趣的问题,你所问的有点像像Alntlr那样的解析器生成器生成的代码。

我认为通过将对象创建为XSLT转换的副作用,您可能想要的是什么。您可以使用以下代码在XSLT脚本中创建对象和调用方法:

在XSLT脚本中实例化Java对象;

<!-- Create object factory. -->
<xsl:variable name="factory" xmlns:java="http://xml.apache.org/xalan/java"
    select="java:my.sample.Factory.getInstance()" />

稍后使用它在脚本中创建对象树:

<xsl:template match="node">
    <xsl:variable name="myObject" xmlns:java="http://xml.apache.org/xalan/java"
                select="java:getInstance($provider, string(@parent), string(@type))" />

这会在my.sample.Factory类上的静态getInstance()方法创建的工厂对象上调用方法getInstance(String,String)。工厂还必须保留创建的对象,以便在转换完成后,您可以从工厂实例检索由转换实例化的对象树。您可以事先创建它并将其作为参数传递给脚本,而不是在脚本中创建工厂。

答案 1 :(得分:0)

我的直觉是让您的XSLT转换以通常的方式生成XML树,然后将此树管道传输到Java数据绑定工具中以将其转换为Java对象。 (当然,树永远不需要被序列化为词汇XML;您可以使用SAX调用来连接组件。)。