XSLT 2 (Saxon):如何将多个文件读入内存
Posted
技术标签:
【中文标题】XSLT 2 (Saxon):如何将多个文件读入内存【英文标题】:XSLT 2 (Saxon): How to read multiple files into memory 【发布时间】:2021-10-09 15:56:13 【问题描述】:如何将多个 xml 文件读入内存/流?
使用<xsl:result-document>
我可以将 xml 拆分为多个 xml 到目录中。
我想将多个结果文件读入内存
XSL:
<xsl:template match="/testdata">
<xsl:for-each select="trd">
<xsl:result-document href="result_position().xml">
<abc>
<xyz>
<xsl:copy-of select="*"/>
</xyz>
</abc>
</xsl:result-document>
</xsl:for-each>
</xsl:template>
通过下面我可以将一个生成的 xml 读入内存(在删除 <xsl:result-document>
之后)。我想将多个输出 xml 读入内存
System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl");
TransformerFactory tFactory = TransformerFactory.newInstance();
Source xslt = new StreamSource(new File("testxsl.xsl"));
Transformer transformer = null;
transformer = tFactory.newTransformer(xslt);
Source xmlInput = new StreamSource(new File("test.xml"));
StreamResult standardResult = new StreamResult(new ByteArrayOutputStream());
transformer.transform(xmlInput, standardResult);
【问题讨论】:
要使用 Java 中的 Saxon 和 XSLT 2 或 3,我建议转移到 saxonica.com/html/documentation10/using-xsl/embedding/… 中引入的 s9api API。要处理结果文档,请参阅saxonica.com/html/documentation10/javadoc/net/sf/saxon/s9api/…。 【参考方案1】:使用标准 JAXP API(它是为 XSLT 1.0 设计的,从未升级)无法做到这一点。使用 Saxon 的 s9api API,并调用 Xslt30Transformer.setResultDocumentHandler() 为结果文档提供目的地。如果您希望将结果作为 XdmNode 对象,这可以是 XdmDestination;如果您希望在内存中捕获序列化结果,它可以是写入内存中 OutputStream 或 StringWriter 的序列化程序。
【讨论】:
以上是关于XSLT 2 (Saxon):如何将多个文件读入内存的主要内容,如果未能解决你的问题,请参考以下文章
XML XSLT 使用 SAXON EE10.6 流式传输大型 xml 文件