我的用例是:
File
作为输入Result
处理XMLStreamReader
(使用Java 8内置StAX实现)我想在"流媒体模式下做到这一点" (所以不将XSL转换的输出写入文件,而不是通过XMLStreamReader解析它。)
这可能吗?如果是这样,怎么样?我只能找到基于SAX的例子。
答案 0 :(得分:2)
可能不可能。大多数XSLT引擎都会写出结果" tree"在推送模式下,您可以通过接收发生的事件来跳过创建物理树,但是如果您想在拉模式下获得结果,则需要在一个线程中运行转换并阅读导致另一个线程,使用类似BlockingQueue的东西将事件从线程传递到另一个线程。 Saxon有内部机制以这种方式使用多个线程处理推拉冲突,但仅限于项目级别,而不是事件级别,这对您没有多大用处,因为整个结果树是一个项目。所以基本的答案是,我能看到你想做的唯一方法是编写一个多线程的SAX-to-StAX转换器,这是一个棘手的Java编码。
答案 1 :(得分:1)
当您运行转换时,XSLT处理器需要在转换调用中构建其结果。
很容易看到引擎可以将结果写入流,或者构建 DOM (或任何其他内存结构),或者调用的 SAXHandler 强>
但引擎如何直接接受并调用一个XMLStreamReader,它具有与面向回调的SAX Handler不同的编程模型?
但是你可以根据转换创建一个DOM树。给定DOM,可以创建一个DOMXmlStreamReader
,它遍历DOM并发出Stax令牌。但我不知道这样的实施是否存在。