捕获xsl:java中的消息输出

捕获xsl:java中的消息输出,java,xslt,Java,Xslt,我试图在调用转换时用java捕获xsl:message。下面是我的代码片段 final ArrayList<TransformerException> errorList = new ArrayList<TransformerException>(); ErrorListener errorListener = new ErrorListener() { @Override public void w

我试图在调用转换时用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;
      }
final ArrayList errorList=new ArrayList();
ErrorListener ErrorListener=新的ErrorListener(){
@凌驾
公共无效警告(TransformerException e)引发TransformerException{
//要更改已实现方法的主体,请使用文件|设置|文件模板。
log.error(例如getMessage());
错误列表。添加(e);
}
@凌驾
公共无效错误(TransformerException e)引发TransformerException{
//要更改已实现方法的主体,请使用文件|设置|文件模板。
log.error(例如getMessage());
错误列表。添加(e);
}
@凌驾
public void fatalError(TransformerException e)抛出TransformerException{
//要更改已实现方法的主体,请使用文件|设置|文件模板。
错误列表。添加(e);
投掷e;
}
};
...
尝试
{
transformer.setErrorListener(errorListener);
newDoc=变换(transformer,oldDoc);
}
捕获(转换异常e){
错误(“将规范化文档转换为PUBS-XML的问题”,e);
投掷e;
}
不幸的是,这不起作用

有更好的办法吗


提前谢谢

如果您使用的是Saxon,则可能需要

public void setMessageEmitter(Receiver-Receiver)

设置用于xsl:message输出的接收器

JAXP接口的最新版本指定默认情况下
xsl:message
的输出被发送到 注册错误侦听器撒克逊人会 不执行此约定。 相反,输出被发送到 默认消息发射器,它是 略为定制的 标准撒克逊发射器接口

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

:

ErrorListener
是一个 很晚才介绍给JAXP 阶段(许多令人遗憾的事件之一) 规格变更的场合 单方面匹配Xalan )和我决定不这样做 默认情况下实现此更改 行为,因为它本来是 中断现有应用程序

在Saxon中,
xsl:message
输出是 指向一个接收器,你可以 向变压器提名:

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

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

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

net.sf.saxon.event.MessageWarner())


您使用的是哪个xslt处理器?相信我使用的是带有javax.xml.transform.*的Xalan。我的样式表是版本2.0。处理器是萨克森。下面的答案是捕获xsl的解决方案:message output.net.sf.saxon.event.MessageWarner是saxon的旧版本(9.3及更早版本?)和saxon CE(基于9.3代码库)的合适类。在较新版本的saxon中,它是net.sf.saxon.serialize.MessageWarner。请注意,这会将消息发送到ErrorListener的warning()方法,除非terminate=“yes”,在这种情况下,它会将消息发送到error()方法。如果有人感兴趣:我在这里为Saxon的TransformerFactory制作了一个包装器: