以流模式读取使用 StAX 的 XSL 转换结果

Read result of XSL Transformation with StAX in a streaming mode

我的用例是:

我想在 "streaming mode" 中执行此操作(因此 不是 将 XSL 转换的输出写入文件,而不是通过 XMLStreamReader).

这可能吗?如果是这样,如何?我只能找到基于 SAX 的示例。

当您 运行 进行转换时,XSLT 处理器需要在转换调用中构建其结果。

很容易看出引擎可以将结果写入一个stream,或者建立一个DOM (或任何其他内存结构),或调用 SAXHandler.

但是引擎应该如何直接接受和调用 XMLStreamReader,它的编程模型与面向回调的 SAX 处理程序不同?

但是您可以创建一个 DOM 树作为转换的结果。给定 DOM 可以创建一个 DOMXmlStreamReader 迭代 DOM 并发出 Stax 代币。但是不知道有没有这样的实现。

可能不可能。大多数 XSLT 引擎在推模式下写入结果 "tree",因此您可以通过在事件发生时接受事件来跳过物理树的创建,但是如果您想在拉模式下获得结果,您将需要运行 在一个线程中进行转换并在另一个线程中读取结果,使用类似 BlockingQueue 的东西将事件从一个线程传递到另一个线程。 Saxon 具有以这种方式使用多个线程处理推拉冲突的内部机制,但仅限于项目级别,而不是事件级别,这对您没有多大用处,因为整个结果树是一个项目。所以基本的答案是,我能看到做你想做的唯一方法是编写一个多线程 SAX 到 StAX 转换器,这是 Java 编码的一个棘手位。