此问题与a recent answer by michael.hor257k 有关,后者与an answer by Dimitre Novatchev 有关。
当在上面提到的答案中使用样式表(通过 michael.hor257k )时,对于大型XML(大约60MB,下面是样本XML),转换成功执行。
当尝试另一个样式表时,与michael.hor257k略有不同,并且旨在将元素(带有子sectPr
)及其后续兄弟分组(直到下一个带有子{cibling元素的子元素{{ 1}}),递归地(即,将元素分组到输入XML的深度)。
示例输入XML:
sectPr
我试过的样式表:
<body>
<p/>
<p>
<sectPr/>
</p>
<p/>
<p/>
<tbl/>
<p>
<sectPr/>
</p>
<p/>
</body>
出于好奇,我遇到了 OutOfMemoryError 转换大约60MB的XML。
我想知道,我认为我不理解michael.hor257k和Dimitre Novatchev提供的XSLT背后的技巧,它不会导致内存异常。
我的样式表与上面提到的OutOfMemoryError的答案之间有什么重大区别。如何更新样式表以提高内存效率。
答案 0 :(得分:5)
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
和215MB
个节点的节点数。转换在5.06
秒