Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Capture xsl:message output in java

Tags:

java

xslt

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!

like image 754
Sal Velazquez Avatar asked Jan 14 '11 20:01

Sal Velazquez


1 Answers

If you are using Saxon, then you may need to set the message emitter using setMessageEmitter().

https://www.saxonica.com/html/documentation10/javadoc/net/sf/saxon/trans/XsltController.html#setMessageEmitter-net.sf.saxon.event.Receiver-

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.

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 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())

like image 192
Mads Hansen Avatar answered Nov 10 '22 06:11

Mads Hansen