2014-12-17 2 views
4

Я использую Saxon XSLT версии 9.6.0.1. Таблица стилей содержит этот код:xslt: сообщение в Саксонии - где сообщение?

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

Мое приложение завершается, как ожидается, с этим исключением:

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) 

Теперь мне интересно, где «ErrorMessage» текст на самом деле идет. Я вижу это на stderr, но должен отображать его пользователю или помещать его в файл журнала.

Как программно получить доступ к тексту сообщения?

+2

Какого API вы используете с Saxon 9.6, то API JAXP или s9api? –

+0

По-видимому, я использую JAXP API, хотя у меня есть часть кода, которая проверяет саксон TransformerImpl, бросает класс и устанавливает MessageEmitter. Как уже упоминалось ниже, есть MessageListener. В чем разница между MessageEmitter и MessageListener? – Hiran

ответ

4

Если вы используете Saxon s9api затем увидеть образец файл S9APIExamples в саксонских ресурсах (имеются в http://saxonica.com/download/download_page.xml), то есть пример настройки 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(); 
+1

Можно ли установить MessageListener с помощью JAXP API? – Hiran

+0

См. Https://stackoverflow.com/questions/4695489/capture-xslmessage-output-in-java для решения с использованием JAXP. – rakensi