繁体   English   中英

XSLT 3.0流媒体(撒克逊语)

[英]XSLT 3.0 streaming (Saxon)

我有一个大型XML文件(6 GB)与这种树:

<Report>
   <Document>
      <documentType>E</documentType>
      <person>
         <firstname>John</firstname>
         <lastname>Smith</lastname>
      </person>
   </Document>
   <Document>
      [...]
   </Document>
   <Document>
      [...]
   </Document>
   [...]
</Report>

如果我在其上应用XSLT样式表,我有这个错误:

线程“main”中的异常java.lang.OutOfMemoryError:Java堆空间

所以我想尝试新的XSLT 3.0功能:流媒体,使用Saxon 9.6 EE。 我不希望在文档中有一次流限制。 我认为,我想要做的,非常接近这里描述的“突发模式”: http//saxonica.com/documentation/html/sourcedocs/streaming/burst-mode-streaming.html

这是我的撒克逊命令行:

java -cp saxon9ee.jar net.sf.saxon.Transform -t -s:input.xml -xsl:stylesheet.xsl -o:output / output.html

这是我的XSLT样式表:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">
<xsl:mode streamable="yes" />

<xsl:template match="/">
    GLOBAL HEADER
        <xsl:iterate select="copy-of()/Report/Document" >
           DOC HEADER
           documentType: <xsl:value-of select="documentType"/>
           person/firstname: <xsl:value-of select="person/firstname"/>
           DOC FOOTER
           <xsl:next-iteration/>
        </xsl:iterate>
    GLOBAL FOOTER
</xsl:template>

</xsl:stylesheet>

但我仍然有同样的内存不足错误。

谢谢您的帮助!

您的副本()正在复制上下文项,即整个文档。 你要

copy-of(/Report/Document)

它依次复制每个文档。 或者我倾向于写它

/Report/Document/copy-of()

因为我觉得它更清楚了解到底发生了什么。

顺便说一下,你不需要xsl:iterate:xsl:for-each将完美地完成工作,因为一个Document的处理不依赖于任何先前文档的处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM