我有许多非常大的XML文件,我希望将它们转换成(同样大的) JSON文件。为此,我编写了一个XSLT,它将XML转换为XSLT 3.0规范中指定的"XML- To -JSON表示“。然后,我可以调用fn:xml-to-json函数。
但是,我想让这个过程保持稳定的内存使用。这个是可能的吗?
发布于 2019-05-23 05:33:48
不幸的是,不可能(根据W3C的XSLT3.0规范,或者在Saxon实现中)在单个样式表中编写多阶段流转换。通常有两种编写多阶段转换的方法(即,由两个单独的转换组成的转换):第一阶段可以作为函数调用,或者第一阶段可以在变量中传递其结果。这两种机制都不允许中间结果(第一阶段的结果)以流式文档的形式交付。
(我们在设计规范时就意识到了这一限制,但决定将其从需求中去掉,因为事情已经变得足够复杂了。)
但我相信这可以在Saxon中完成,使用链接在一起的两个单独的样式表实现的多阶段转换。最简单的方法可能是使用s9api接口。编写第二个转换t2.xsl (简单地调用xml-to-json),如下所示:
<xsl:transform version="3.0" expand-text="yes"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:mode streamable="yes"/>
<xsl:output method="text"/>
<xsl:template match="/">{xml-to-json(.)}</xsl:template>
</xsl:transform>然后执行以下操作:
Processor proc = new Processor(true);
Serializer out = proc.newSerializer(new File("out.xml");
XsltCompiler comp = proc.newXsltCompiler();
Xslt30Transformer t2 = comp.compile(new File("t2.xsl")).load30();
Destination phase2 = t2.asDocumentDestination(out);
Xslt30Transformer t1 = comp.compile(new File("t1.xsl").load30();
t1.applyTemplates(source, phase2);注意:尽管输入文档和中间XML都是流式传输的,但输出JSON (我认为)在写出到输出文件之前是完全在内存中构造的。这有点不幸,我们应该试着修复它。
https://stackoverflow.com/questions/56247497
复制相似问题