我正在尝试在调用我的转换时捕获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())