【问题标题】:Can I add a messageListener to an xslt Template object?我可以将 messageListener 添加到 xslt 模板对象吗?
【发布时间】:2013-04-26 15:14:55
【问题描述】:

我想添加一个功能来捕获 xsl:message 输出到现有应用程序。找到了将 messageListener 添加到转换器的简单参考,但我的应用程序包含一个 saxTransformerFactory.newTemplates() 生成一个模板对象,然后该对象用于创建一个 xmlfilter,“XMLFilter xmlFilter = saxTransformerFactory.newXMLFilter(templates);”。如何在“实现 MessageListener”的类中加入?

【问题讨论】:

    标签: xslt sax


    【解决方案1】:

    TransformerFactory 和相关类是一个独立于产品的 API(称为 JAXP,有时称为 Trax),用于调用 XSLT 处理器。 MessageListener 特定于 Saxon 产品。您可以使用 Saxon 的 Controller 对象注册 MessageListener,该对象是 JAXP Transformer 的 Saxon 实现。如果您有一个 JAXP Transformer,您需要将 Transformer 转换为 Saxon Controller,然后调用 setMessageListener。当您将 XMLFilter 与 Saxon 一起使用时,XMLFilter 将是 net.sf.saxon.Filter 的一个实例。这有一个 getTransformer() 方法,它返回 Controller。

    【讨论】:

    • 事实上,我的 XMLFilter 是 org.xml.sax.XMLFilter 的一个实例,它似乎没有 getTranformer() 方法。我想我将不得不在不捕获 xsl:message 的情况下生活!
    • org.xml.sax.XMLFilter 是一个接口,所以实现这个接口的任何东西也将属于一个具体的类。
    【解决方案2】:

    正如 Michael Kay 所解释的,但更多的是在 Java 代码中;-)

    TransformerFactory factory = TransformerFactory.newInstance();
    Transformer transformer = factory.newTransformer(xslt);
    if (transformer instanceof TransformerImpl) {
       //saxon specific
       TransformerImpl timpl = (TransformerImpl) transformer;
       XsltTransformer saxonTransformer = timpl.getUnderlyingXsltTransformer();
       saxonTransformer.setMessageListener( ...your listener... );
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-16
      • 2011-11-06
      • 1970-01-01
      相关资源
      最近更新 更多