【问题标题】:XSLT as builder/factoryXSLT 作为建造者/工厂
【发布时间】:2011-06-29 19:54:29
【问题描述】:

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

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

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

【问题讨论】:

  • 只要你输出的东西可以反序列化,那么答案是肯定的。例如,您可以输出 JSON,这是一种几乎可以用任何语言反序列化的格式。

标签: templates xslt factory builder


【解决方案1】:

有趣的问题,你问的有点像 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)。工厂还必须保留创建的对象,以便在转换完成后,您可以从工厂实例中检索由转换实例化的对象树。您可以预先创建工厂并将其作为参数传递给脚本,而不是在脚本中创建工厂。

【讨论】:

  • 我知道java:-trick,但不知道如何从模板返回调用结果。您似乎提供了缺少的链接;谢谢!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多