[英]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.