Saxon 9.8 企业版 (Saxon 9.8 EE) 支持已有一年历史的 XSLT 3.0 规范的流功能,它允许您使用 XSLT 的子集以仅向前的方式读取 XML 文档,仅使用所需的内存存储当前访问的节点及其祖先。
使用这种方法,您可以编写代码,例如for-each-group select="activity/deliv" group-adjacent="(position() - 1) idiv $size"
进行位置分组,deliv
按deliv
元素读取文件并将它们收集到以下组中$size
:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:math="http://www.w3.org/2005/xpath-functions/math"
exclude-result-prefixes="xs math"
version="3.0">
<xsl:param name="size" as="xs:integer" select="1000"/>
<xsl:mode on-no-match="shallow-copy" streamable="yes"/>
<xsl:template match="root">
<xsl:for-each-group select="activity/deliv" group-adjacent="(position() - 1) idiv $size">
<xsl:result-document href="split-{format-number(current-grouping-key() + 1, '00000')}.xml" indent="yes">
<root>
<activity>
<xsl:copy-of select="current-group()"/>
</activity>
</root>
</xsl:result-document>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
这会将您的输入拆分为多个文件,每个文件都有$size
deliv
元素(如果剩余deliv
元素少于$size
左侧,则分别是最后一个元素)。
使用 Saxon EE 需要获得商业许可证,但存在试用许可证。