这个问题与最近的回答 迈克尔·霍257k,这又与的回答 迪米特·诺瓦切夫.
当使用上述答案中的样式表时(通过迈克尔·霍257k),对于一个大的XML(大约60MB,下面是示例XML)并且转换成功进行。
当尝试另一个样式表时,与 michael.hor257k 的有点不同,并且旨在对元素进行分组(带有子元素)sectPr
) 及其后续兄弟元素(直到下一个带有子元素的后续兄弟元素sectPr
),递归地(即,将元素分组到输入 XML 的深度)。
示例输入 XML:
<body>
<p/>
<p>
<sectPr/>
</p>
<p/>
<p/>
<tbl/>
<p>
<sectPr/>
</p>
<p/>
</body>
我尝试过的样式表:
<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>
出于好奇,我遇到了内存不足错误转换大约 60MB 的 XML。
我想知道,并且我认为我不理解 michael.hor257k 和 Dimitre Novaatchev 提供的 XSLT 背后的技巧,这不会导致内存异常。
我的样式表和上面提到的我得到 OutOfMemoryError 的答案之间的最大区别是什么。以及如何更新样式表以提高内存效率。
林加莫西 CS,
请添加<xsl:strip-space elements="*"/>
声明,您从原始解决方案中删除了该声明。这会从源 XML 文档中去除任何仅包含空格的文本节点。
不剥离这些节点可能会显着增加节点的数量以及保存它们的内存 - 在您的情况下,保存 XML 文档所需的内存几乎是保存具有这些节点的 XML 文档所需内存的两倍被剥夺了。
我运行您的转换正常,但在删除节点后,它在 MS XslCompiledTransform 上运行速度提高了 20%。
然后我运行了你的转换——一次是在问题中发布的,第二次是添加了的<xsl:strip-space elements="*"/>
与 Saxon 9.1J — 因为它还显示了转换的内存消耗。两次运行都取得了成功。在第一种情况下,处理的节点数是9525004
and 340MB
使用了内存。转型经历了5.3
秒。在第二种情况下,节点数为4336366
and 215MB
使用了内存。转变发生在5.06
sec
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)