当前位置: 首页 > 知识库问答 >
问题:

XSLT:Saxon 9.4与Saxon 9.6中的消息

邹玮
2023-03-14

我试图从java代码中抛出异常,在使用Saxon时,这些代码将包含来自xsl:message标记的消息。

使用以下xslt文件

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <xsl:message terminate="yes">exception message</xsl:message>
    </xsl:template>
</xsl:stylesheet>

在Saxon9.4上使用以下代码

public static void main(String[] args) throws TransformerException {
    try {
        TransformerFactory fact = new net.sf.saxon.TransformerFactoryImpl();
        Transformer newTransformer = fact.newTransformer(new StreamSource(new File("throw.xslt")));
        ((net.sf.saxon.Controller)newTransformer).setRecoveryPolicy(Configuration.DO_NOT_RECOVER);
        ((net.sf.saxon.Controller)newTransformer).setMessageEmitter(new MessageWarner());
        newTransformer.transform(new StreamSource(new File("input.xml")), new StreamResult(new File("output.xml")));
    } catch (TransformerException e) {
        System.out.println("THIS IS EXCEPTION: " + e.getMessage() + " <<<");
        throw e;
    }
}   

它给出了this IS exception:exception message<<,这是我所期望的行为。

但在Saxon9.6上,由于API的更改,代码略有调整

public static void main(String[] args) throws TransformerException {
    try {
        TransformerFactory fact = new net.sf.saxon.TransformerFactoryImpl();
        Transformer newTransformer = fact.newTransformer(new StreamSource(new File("throw.xslt")));
        ((net.sf.saxon.jaxp.TransformerImpl)newTransformer).getUnderlyingController().setRecoveryPolicy(Configuration.DO_NOT_RECOVER);
        ((net.sf.saxon.jaxp.TransformerImpl)newTransformer).getUnderlyingController().setMessageEmitter(new MessageWarner());
        newTransformer.transform(new StreamSource(new File("input.xml")), new StreamResult(new File("output.xml")));
    } catch (TransformerException e) {
        System.out.println("THIS IS EXCEPTION: " + e.getMessage() + " <<<");
        throw e;
    }
}

它给出了这是异常:处理在throw.xslt<<中的第4行被xsl:message终止,并且xsl:message丢失了。

如何在“9.6”上实现“9.4”行为?

共有1个答案

申屠瀚海
2023-03-14

这是由于MessageEmitter向其发送消息的消息侦听器造成的。在Saxon9.6中,默认侦听器实现了UnfailingErrorListener,它不能抛出异常(与9.6中的所有其他侦听器一样),但在9.4中,可以从侦听器抛出异常。

但是,您可以实现自己的消息发射器,它会在遇到终止设置为yes的xml:message时抛出异常,如下所示:

final class ExceptionThrowingMessageEmitter extends XMLEmitter {
  boolean abort = false;

  public void startDocument(int properties) throws XPathException {
    setWriter(new StringWriter());
    abort = (properties & ReceiverOptions.TERMINATE) != 0;
    super.startDocument(properties);
  }

  public void endDocument() throws XPathException {
    XPathException de = new XPathException(getWriter().toString());
    de.setErrorCode("XTMM9000");
    if (abort) {
      throw de;
    } else {
      //terminate set to no, do something like writing to the log file
    }
  }

  public void close() {
    // do nothing
  }
}

然后,按如下方式注册:

transformer.getUnderlyingController().setMessageEmitter(new ExceptionThrowingMessageEmitter());  

这样,当存在终止xml:message时,将引发异常

 类似资料:
  • 我正在用Java Swing开发一个应用程序,有时我需要在这些情况下显示消息: > 当用户点击“添加”按钮时,由于TCP连接,需要较长的时间。我正在使用来显示“processing...”致用户。当用户单击“添加”按钮时,我会更改面板的,其中包含消息。 我想问,这是一个错误的做法吗?它是否会导致性能和可视化问题?我应该使用还是来实现这些过程?

  • OpenStack使用消息传递(我想默认情况下是RabbitMQ?)用于节点之间的通信。另一方面,Kubernetes(谷歌内部博格的血统)使用RPC。Docker的swarm也使用了RPC。两者都是基于grpc/protofbuf的,在Google内部似乎也大量使用。

  • 是否有一种方法以编程方式访问和打印使用者滞后偏移,或者说使用者读取的最后一条记录的偏移与某个生产者写入该使用者分区的最后一条记录的偏移之间的位置差。 要知道我的最终目标是将这个值发送到prometheus进行监视,我应该在上面添加哪些语句来得到滞后偏移值?

  • 我是流媒体代理(如Kafka)的新手,来自排队消息系统(如JMS、Rabbit MQ)。 我从Kafka文档中读到,消息作为记录存储在Kafka分区的偏移量中。消费者从偏移量读取。 消息和记录有什么区别[多个/部分消息是否构成记录?] 当消费者从偏移量读取时,消费者是否有可能读取部分消息?消费者是否需要基于某种逻辑将这些对等消息串起来? 或 1条消息=1条记录=1个偏移量 之所以会出现这个问题,是

  • 我正在尝试让 kafka 消费者获取在 Java 中生成并发布到主题的消息。我的消费者如下。 consumer.java 当我运行上面的代码时,我在控制台中什么也看不到,屏幕后面的java producer程序正在‘AATest’主题下不断地发布数据。另外,在动物园管理员控制台中,当我尝试运行上面的consumer.java时,我得到了以下行 此外,当我运行指向 AATest 主题的单独控制台使用