我的目标是将包含各种内容(大约2到15 GB)的大型单个
XML文件拆分为多个
XML文件,每个文件包含一个特定的实体类型,稍后可以由SQL数据库导入.我目前正在使用Saxon-EE版本9.5.1.2J,但如果它能快速可靠地完成任务,那么任何其他XSL处理器都可以.
这是我已经想到的:
> Saxon似乎是XSLT 3.0的事实标准处理器,而Raptor XML服务器似乎是另一种(更昂贵的)选择.其他XSL处理器通常只支持XSLT 1.0.
>可以使用XSLT 3.0流处理大文件,因此整个文件不需要适合内存.注意:此功能仅适用于Saxon Enterprise Edition.
>您可以使用< xsl:result-document>将输出写入不同的文件,但不能在同一样式表中多次使用它来写入同一个文件(显然不是线程安全的).
>< xsl:for-each-group> group-by显然不是可流动的
>< xsl:stream>只能包含一个< xsl:iterate>块,没关系.但是:在迭代块内,您只能访问当前节点和一个子节点的属性(甚至< xsl:for-each>在该节点上工作).如果您尝试访问第二个节点的值,则会出现“SXST0060:多个子表达式消耗输入流”错误.
>< xsl:apply-templates>里面< xsl:stream> (而不是迭代)需要模式可流化(如下所示).但是,流只能像迭代一样使用一次 – 否则你也会得到错误“SXST0060:多个子表达式消耗输入流”.
我的结论是,当前可用的XSL处理器需要使用多个< xsl:stream>用于写入不同文件的标记,实际上意味着为每个输出文