【问题标题】:xslt:message in Saxon - where is the message?xslt:message in Saxon - 消息在哪里?
【发布时间】:2014-12-17 10:06:02
【问题描述】:

我使用 Saxon XSLT 版本 9.6.0.1。样式表包含以下代码:

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

现在我想知道“错误消息”文本的实际位置。我可以在 stderr 上看到它,但需要将其显示给用户或将其放入日志文件中。

如何以编程方式访问消息文本?

【问题讨论】:

  • 您在 Saxon 9.6 中使用哪个 API,JAXP API 还是 s9api?
  • 显然我正在使用 JAXP API,而我已经有一段代码可以检查 saxon TransformerImpl、强制转换类并设置 MessageEmitter。如下所述,有一个 MessageListener。 MessageEmitter 和 MessageListener 有什么区别?

标签: xml xslt message saxon


【解决方案1】:

如果您使用撒克逊语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();

【讨论】:

猜你喜欢
  • 2012-09-05
  • 2016-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-28
  • 2013-05-12
  • 2021-01-13
  • 2012-10-03
相关资源
最近更新 更多