XSLT 流式链接转换

XSLT Streaming Chained Transform

我正在使用 Saxon EE 来转换一个非常大的文档,使用流转换。我现在需要链接多个 XSLT。如何做到这一点? 当不流式传输时,我使用 XSLTTransformer class 作为目标,进行链式转换。如果我没记错的话,我想我不能那样做,因为那样会创建一个结果树而不是结果流。 谢谢, 阿尼

将第一次转换的 SAX 输出事件通过管道传输到第二次转换的 SAX 输入事件。

我附上了一些示例 Scala 代码来说明这一点。

基本上它首先启动第二个 XSLT,它在幕后调用第一个 XSLT,初始输入文档捕获中间输出,然后实时将其作为输入提供给第二个 XSLT。不错

  • 它使用 JAXP 接口,所以没有 S9 API。
  • 我已经成功地使用 1.2GB 输入 XML 文件对其进行了测试。

希望对您有所帮助。

XSLT 3.0 顺便说一下!不错的选择。

import javax.xml.transform.sax.{SAXResult, SAXSource}
import javax.xml.transform.stream.{StreamResult, StreamSource}
import javax.xml.transform.{Source, Transformer}

import com.saxonica.config.StreamingTransformerFactory
import org.xml.sax._
import org.xml.sax.helpers.XMLFilterImpl

object Main extends App
{
  val transformer1 = transformer("transform-1.xsl")
  val transformer2 = transformer("transform-2.xsl")

  val inputXML = "big.xml"

  transformer2.transform(
    new SAXSource(
      new Transformer1OutputReader(transformer1, new StreamSource(inputXML)),
      null
    ),
    new StreamResult("out.xml")
  )

  def transformer(xslt : String) =
    new StreamingTransformerFactory().newTransformer(new StreamSource(xslt))

}


class Transformer1OutputReader(
  transformer1 : Transformer,
  source1 : Source) extends XMLFilterImpl
{
  def parseImpl() =
  {
    println("parseImpl()")

    val inputToSecondXslt : ContentHandler = getContentHandler

    transformer1.transform(
      source1,
      new SAXResult(inputToSecondXslt)
    )
  }

  override def parse(input : InputSource) = parseImpl
  override def parse(systemId : String) = parseImpl
  override def setFeature(name: String, value: Boolean) : Unit = {}
}