I’m trying to capture xsl:message in java when calling my transform. Below is a snippet of my code.
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; }
Unfortunately this is not working.
Is there a better way?
Thanks in advance!
Answer
If you are using Saxon, then you may need to set the message emitter using setMessageEmitter().
public void setMessageEmitter(Receiver receiver)
Set the Receiver to be used for xsl:message output.
Recent versions of the JAXP interface specify that by default the output of
xsl:message
is sent to the registered ErrorListener. Saxon does not implement this convention. Instead, the output is sent to a default message emitter, which is a slightly customised implementation of the standard Saxon Emitter interface.This interface can be used to change the way in which Saxon outputs
xsl:message
output.
ErrorListener
was something that was introduced to JAXP at a rather late stage (one of many regrettable occasions where the spec was changed unilaterally to match the Xalan implementation), and I decided not to implement this change as a default behaviour, because it would have been disruptive to existing applications.In Saxon,
xsl:message
output is directed to a Receiver, which you can nominate to the Transformer:
((net.sf.saxon.Controller)transformer).setMessageEmitter(....)
If you want to follow the JAXP model of sending the output to the ErrorListener, you can nominate a Receiver that does this:
((net.sf.saxon.Controller)transformer).setMessageEmitter(new net.sf.saxon.event.MessageWarner())