在java中捕获xsl:message输出

Sal*_*uez 8 java xslt

我正在尝试在调用我的转换时捕获java中的xsl:message.下面是我的代码片段.

        final ArrayList<TransformerException> errorList = new ArrayList<TransformerException>();
        ErrorListener errorListener = new ErrorListener() {
          @Override
          public void warning(TransformerException e) throws TransformerException {
            //To change body of implemented methods use File | Settings | File Templates.
            log.error(e.getMessage());
            errorList.add(e);
          }

          @Override
          public void error(TransformerException e) throws TransformerException {
            //To change body of implemented methods use File | Settings | File Templates.
            log.error(e.getMessage());
            errorList.add(e);
          }

          @Override
          public void fatalError(TransformerException e) throws TransformerException {
            //To change body of implemented methods use File | Settings | File Templates.
            errorList.add(e);
            throw e;
          }
      };
      ...
      try
      {
        transformer.setErrorListener(errorListener);
        newDoc = transform(transformer, oldDoc);
      }
      catch (TransformerException e) {
        log.error("Problem transforming normalized document into PUBS-XML", e);
        throw e;
      }
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不起作用.

有没有更好的办法?

提前致谢!

Mad*_*sen 12

如果您使用的是Saxon,则可能需要使用setMessageEmitter()设置消息发射器.

http://www.saxonica.com/documentation/javadoc/net/sf/saxon/Controller.html

public void setMessageEmitter(Receiver receiver)

将Receiver设置为用于xsl:message输出.

最新版本的JAXP接口指定默认情况下将输出xsl:message发送到已注册的ErrorListener.撒克逊人没有实施这一惯例. 相反,输出被发送到默认消息发射器,这是标准Saxon Emitter接口的略微定制的实现.

此接口可用于更改Saxon输出 xsl:message输出的方式.

Michael Kay解释了为什么Saxon不xsl:message根据JAXP接口输出,并提出了两个获取输出的选项:

ErrorListener是在一个相当晚的阶段引入JAXP的东西(许多令人遗憾的情况之一,规范单方面改变以匹配Xalan实现),我决定不将此更改实现为默认行为,因为它会破坏性现有的应用程序.

在Saxon中,xsl:message输出被定向到接收器,您可以指定给变换器:

((net.sf.saxon.Controller)transformer).setMessageEmitter(....)

如果要遵循将输出发送到ErrorListener的JAXP模型,可以指定执行此操作的Receiver:

((net.sf.saxon.Controller)transformer).setMessageEmitter(new net.sf.saxon.event.MessageWarner())

  • net.sf.saxon.event.MessageWarner是Saxon的旧版本(9.3和更早版本?)和Saxon-CE(基于9.3代码库)的正确类。在较新版本的Saxon中为net.sf.saxon.serialize.MessageWarner。请注意,这会将消息发送到ErrorListener的warning()方法,除非终止为&lt;yes”,在这种情况下,它将消息发送到error()方法。 (2认同)
  • 如果有人感兴趣:我在这里为 Saxon 的 TransformerFactory 制作了一个包装器:https://github.com/nverwer/cocooncomponents/blob/master/src/org/apache/cocoon/components/xslt/SaxonTransformerFactoryImpl.java (2认同)