Lin*_* CS 4 xml xslt out-of-memory xslt-2.0 xslt-1.0
这个问题与michael.hor257k 最近的答案 有关,后者与Dimitre Novatchev 的答案有关.
当在上面提到的答案中使用样式表(由michael.hor257k)时,对于大型XML(大约60MB,下面是样本XML),转换成功执行.
当尝试另一个样式表,与michael.hor257k有点不同,并且旨在将元素(带有子sectPr)和它们的后续兄弟(直到下一个带有子元素的下一个兄弟元素sectPr)分组,递归(即,将元素分组到输入XML的深度).
示例输入XML:
<body>
<p/>
<p>
<sectPr/>
</p>
<p/>
<p/>
<tbl/>
<p>
<sectPr/>
</p>
<p/>
</body>
Run Code Online (Sandbox Code Playgroud)
我试过的样式表:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="*">
<xsl:copy>
<xsl:apply-templates select="*[1] | *[sectPr]"/>
</xsl:copy>
<xsl:apply-templates select="following-sibling::*[1][not(sectPr)]"/>
</xsl:template>
<xsl:template match="*[sectPr]">
<myTag>
<xsl:copy>
<xsl:apply-templates select="*[1] | *[sectPr]"/>
</xsl:copy>
<xsl:apply-templates select="following-sibling::*[1][not(sectPr)]"/>
</myTag>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
出于好奇,我遇到了OutOfMemoryError转换大约60MB的XML.
我想知道,我认为我不理解michael.hor257k和Dimitre Novatchev提供的XSLT背后的技巧,它不会导致内存异常.
我得到OutOfMemoryError的样式表和上面提到的答案之间有什么大的区别.如何更新样式表以提高内存效率.
Lingamurthy CS,
请添加<xsl:strip-space elements="*"/>您从原始解决方案中删除的声明.这将从源XML文档中剥离任何仅空白文本节点.
不剥离这些节点可能会显着增加节点数量和保存它们的内存 - 在这种情况下,保存XML文档所需的内存几乎是用于保存XML文档与这些节点所需的内存的两倍剥离.
我运行您的转换确定,但在剥离节点时,它运行速度提高了20% - 在MS XslCompiledTransform上.
然后我运行了你的转换 - 一次发布在问题中,第二次添加<xsl:strip-space elements="*"/>了Saxon 9.1J - 因为它还显示了转换的内存消耗.两次运行都很成功.在第一种情况下处理的节点的数目是9525004与340MB使用的RAM.转型花了5.3几秒钟.在第二种情况下,节点数量4336366和215MBRAM被使用.转型以5.06秒为单位
| 归档时间: |
|
| 查看次数: |
7161 次 |
| 最近记录: |