在流模式下使用StAX读取XSL Transformation的结果

时间:2015-07-21 09:20:09

标签: java xml xslt stax

我的用例是:

  • XML File作为输入
  • 需要使用XSLT进行转换(使用Java 8内置XSLT处理器)
  • 使用Result处理XMLStreamReader(使用Java 8内置StAX实现)

我想在"流媒体模式下做到这一点" (所以将XSL转换的输出写入文件,而不是通过XMLStreamReader解析它。)

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

很容易看到引擎可以将结果写入,或者构建 DOM (或任何其他内存结构),或者调用的 SAXHandler

但引擎如何直接接受并调用一个XMLStreamReader,它具有与面向回调的SAX Handler不同的编程模型?

但是你可以根据转换创建一个DOM树。给定DOM,可以创建一个DOMXmlStreamReader,它遍历DOM并发出Stax令牌。但我不知道这样的实施是否存在。