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 读入内存(在删除 &lt;xsl:result-document&gt; 之后)。我想将多个输出 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 文件

使用 SAXON 和 XSLT 合并 XML 文件

如何在 .NET 中使用 Saxon-HE 9.8 使用 XSLT 3.0

使用 Saxon-JS 识别 XSLT 转换的性能瓶颈

是否有任何XSLT处理命令行工具? [关闭]

使用 XSLT 2.0/3.0 使用多个步骤将 CDATA 中的纯文本解析为 html。那里的一部分