在java中捕获xsl:message输出

时间:2011-01-14 20:16:01

标签: 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;
      }

不幸的是,这不起作用。

有更好的方法吗?

提前致谢!

1 个答案:

答案 0 :(得分:11)

如果您使用的是Saxon,则可能需要set the message emitter using setMessageEmitter()

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

  

public void setMessageEmitter(Receiver receiver)

     

将接收器设置为用于xsl:message输出。

     

JAXP接口的最新版本默认指定   xsl:message的输出发送到。{1}}   注册ErrorListener。 撒克逊人   没有实现这个约定。   而是将输出发送到   默认消息发射器,它是一个   稍微定制实施   标准的Saxon Emitter接口。

     

此界面可用于更改Saxon输出的方式   xsl:message输出。

Michael Kay has explained why Saxon doesn't output xsl:message according to the JAXP interface, and has suggested two options for obtaining the output

  

ErrorListener就是这样的   在一个相当晚的时候介绍给JAXP   阶段(许多遗憾之一   规范改变的场合   单方面匹配Xalan   实施),我决定不这样做   将此更改实现为默认值   行为,因为它本来就是   破坏现有应用程序

     

在Saxon中,xsl:message输出为   指向接收器,你可以   提名给变形金刚:

     

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

     

如果您想遵循JAXP模型   将输出发送到   ErrorListener,你可以提名一个   执行此操作的接收方:

     

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