小编las*_*ero的帖子

使用单个 XSL 流将一个大型 XML 文件拆分为多个文件

我的目标是将包含各种内容(大约 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>inside <xsl:stream>(而不是迭代)需要可流模式(如下所示)。但是,与迭代一样,该流只能使用一次 - 否则您还会收到错误“SXST0060:多个子表达式使用输入流”。

我的结论是,当前可用的 XSL 处理器需要使用多个<xsl:stream>标记来写入不同的文件,这实际上意味着为每个输出文件多次扫描大型输入文件。当将不同实体写入同一输出文件作为解决方法时,情况更是如此,因为不可能多次“使用”同一输入流:

<xsl:mode name="s" streamable="yes"/> …
Run Code Online (Sandbox Code Playgroud)

xml xslt saxon

5
推荐指数
1
解决办法
3751
查看次数

标签 统计

saxon ×1

xml ×1

xslt ×1