2

我正在使用xproc、XML 管道语言和http://xmlcalabash.com/。我想找到一个流式传输大型 xml 文档的示例。例如,给定以下巨大的xml 文档:

<Books>
 <Book>
   <title>Book-1</title>
 </Book>
 <Book>
   <title>Book-2</title>
 </Book>
 <Book>
   <title>Book-3</title>
 </Book>

<!-- many many.... -->
 <Book>
   <title>Book-N</title>
 </Book>
</Books>

我应该如何继续循环(流式传输)x-> N 文档,例如

<Books>
 <Book>
   <title>Book-x</title>
 </Book>
</Books>

并用 xslt 处理每个文档?xproc 可以吗?

4

6 回答 6

2

以下是您可以如何使用 XProc 来实现它,该 XProc 将使用 QuiXProc 进行流式传输

<p:declare-step xmlns:p="http://www.w3.org/ns/xproc" version="1.0">
  <p:load href="hugedocument.xml"/>
  <p:for-each>
    <p:iteration-source select="/Books/Book"/>
    <p:xslt>
      <p:input port="stylesheet">
        <p:document href="book.xsl"/>
      </p:input>
      <p:input port="parameters">
        <p:empty/>
      </p:input>
    </p:xslt>
  </p:for-each>
  <p:wrap-sequence wrapper="Books"/>    
  <p:store href="hugedocument.res.xml"/>
</p:declare-step>
于 2012-12-06T09:44:30.370 回答
2

您应该看看 QuiXProc ( http://code.google.com/p/quixproc ),它是基于 Calabash 的 XProc 实现,添加了流和并行处理希望这会有所帮助。

于 2011-09-02T12:24:47.060 回答
1

EMC 的 Calumet ( http://developer.emc.com/xmltech ) 也不做流媒体。到目前为止,主要关注点一直是遵守 XProc 规范以及与我们的其他 XML 相关工具的集成性,例如 xDB 原生 XML 数据库。对流媒体的支持在我的雷达上,尽管我现在不知道什么时候能够做到这一点。

于 2010-03-30T11:57:48.697 回答
1

是的,尽管我很想支持流,但我对 XML Calabash 的真正目标是完整性和正确性。

我对改造 XML Calabash 的内部结构以使用 Saxon 的更多推/拉流功能有一些想法,但我的“待办事项”列表上还有很多其他的东西:-/

于 2010-03-10T10:53:57.677 回答
1

我记得最近关于 XProc Dev 列表的讨论与流相关。Calabash 似乎没有尝试流式传输,请参阅此处的 Norman Walsh 消息。

Saxon SA,支持 XSLT 和 XQuery 的流式传输,详情请参阅: http: //www.saxonica.com/documentation/sourcedocs/serial.html

于 2009-06-07T08:38:47.037 回答
0

尽管大多数 XProc 处理器不会在步骤之间流式传输数据,但这并不一定意味着您的情况不会工作(例如,内存使用量会爆炸)。这取决于您想对 XSLT 步骤的结果做什么。

如果您正在收集结果,尝试构建一个大的输出文件,那么是的,这可能是一个问题。但在这种情况下,无论如何,您最好使用流式解决方案(SAX、STaX、JOOST 解析器......)。

如果您将分别存储每个 XSLT 的结果,那么问题就会少很多。您只需要关心是否有足够的可用内存来加载初始文档,并对每个文档进行处理。不确定 XMLCalabash 下的 Saxon 表现如何,但我希望高达 50 兆字节的大小不会是一个非常大的问题。

干杯

于 2011-11-12T15:14:08.313 回答