用于转换大型XML文件的内存高效XSLT
这个问题与
a recent answer by michael.hor257k有关,后者与
an answer by 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> 我试过的样式表: <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> 出于好奇,我遇到了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 =“*”/>与撒克逊9.1J – 因为它也显示了转换的内存消耗.两次运行都很成功.在第一种情况下,处理的节点数是9525004并且使用了340MB RAM.转型耗时5.3秒.在第二种情况下,节点数为4336366,使用了215MB RAM.转换在5.06秒内完成 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |