7

I use Saxon XSLT version 9.6.0.1. A stylesheet contains this code:

...
<xsl:message terminate="yes">errormessage</xsl:message>
...

My application terminates as expected with this exception:

net.sf.saxon.expr.instruct.TerminationException: Processing terminated by xsl:message at line 45 in 
    at net.sf.saxon.expr.instruct.Message.processLeavingTail(Message.java:253)  at net.sf.saxon.expr.instruct.Message.processLeavingTail(Message.java:253)
    at net.sf.saxon.expr.instruct.Choose.processLeavingTail(Choose.java:822)

Now I am wondering where the "errormessage" text actually goes. I can see it on stderr but need to display it to the user or put it into the logfile.

How can I programmatically access the message text?

Michael Kay
  • 156,231
  • 11
  • 92
  • 164
Queeg
  • 7,748
  • 1
  • 16
  • 42
  • 2
    Which API are you using with Saxon 9.6, the JAXP API or the s9api? – Martin Honnen Dec 17 '14 at 10:21
  • Apparently I am using the JAXP API, while already I have a piece of code that checks for a saxon TransformerImpl, casts the class and sets a MessageEmitter. As mentioned below there is a MessageListener. What is the difference between a MessageEmitter and a MessageListener? – Queeg Jul 29 '16 at 07:04

1 Answers1

4

If you use the Saxon s9api then see the sample file S9APIExamples in the saxon resources (available at http://saxonica.com/download/download_page.xml), it has an example setting a MessageListener:

        Processor proc = new Processor(false);
        XsltCompiler comp = proc.newXsltCompiler();
        String stylesheet =
                "<xsl:transform version='2.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>\n" +
                        "  <xsl:template name='main'>\n" +
                        "    <xsl:message><msg>Reading http://www.w3.org/TR/xslt20/ ...</msg></xsl:message>/>\n" +
                        "    <exists>\n" +
                        "      <xsl:value-of select=\"doc-available('http://www.w3.org/TR/xslt20/')\"/>\n" +
                        "    </exists>\n" +
                        "    <xsl:message><msg>finishing</msg></xsl:message>\n" +
                        "  </xsl:template>\n" +
                        "</xsl:transform>";
        StringReader reader = new StringReader(stylesheet);
        StreamSource styleSource = new StreamSource(reader, "http://localhost/string");
        XsltExecutable templates = comp.compile(styleSource);
        XsltTransformer transformer = templates.load();
        transformer.setInitialTemplate(new QName("main"));
        transformer.setMessageListener(
                new MessageListener() {
                    public void message(XdmNode content, boolean terminate, SourceLocator locator) {
                        System.err.println("MESSAGE terminate=" + (terminate ? "yes" : "no") + " at " + new Date());
                        System.err.println("From instruction at line " + locator.getLineNumber() +
                                " of " + locator.getSystemId());
                        System.err.println(">>" + content.getStringValue());
                    }
                }
        );
        Serializer out = proc.newSerializer(System.out);
        transformer.setDestination(out);
        transformer.transform();
Martin Honnen
  • 160,499
  • 6
  • 90
  • 110