我正在尝试在调用我的转换时捕获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;
}
不幸的是,这不起作用。
有更好的方法吗?
提前致谢!
答案 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
输出。
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())