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 = {}
}
我正在使用 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 = {}
}