我有很多xml(JUnit测试结果),我想用Xslt 2.0进行转换。
我目前正在使用net.sf.saxon.TransformerFactoryImpl
执行转换
和fn:collection()
在我的xslt中搜索xml文件。像这样:
<xsl:variable name="files" select="collection('file:///Users/admin/Documents/testxml/?select=*.xml;recurse=yes')"/>
<xsl:template match="testsuites">
<root>
<xsl:for-each select="$files//testsuites">
<xsl:call-template name="summary"/>
</xsl:for-each>
</root>
</xsl:template>
有两点让我感到麻烦:
首先是java变换器,我必须传递一个xml“源”,但我真的不需要它,因为我的.xsl正在进行xml搜索和列表。
第二个是当我运行变换超过10(可能是8或7)xml时,我的JVM堆空间已满。我知道我可以提高堆大小,但我必须将变换应用到近300 xml,因此效率不高。
关于我可以做些什么来改善xml的数量我可以改变吗?
由于
编辑:
我试图像这样使用saxon:discard-document()
:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:saxon="http://saxon.sf.net/">
<xsl:output method="xml" indent="yes"/>
<xsl:variable name="files" select="collection('file:///Users/admin/Documents/testxml/?select=*.xml;recurse=yes')"/>
<xsl:template match="testsuites">
<root>
<xsl:for-each select="for $x in ($files//testsuites)return saxon:discard-document($x)">
<xsl:call-template name="summary"/>
</xsl:for-each>
</root>
</xsl:template>
但是我的堆空间仍然出错。难道我做错了什么?
答案 0 :(得分:4)
您不需要将源对象传递给Saxon:您可以在命名模板上开始转换。但是,JAXP API(仅识别XSLT 1.0)不支持此功能 - 您最好切换到s9api接口以充分利用Saxon功能。
至于撒克逊人:discard-document(),我不确定跟踪线程到底有多远。我会避免将这组文档放在一个全局变量中。相反,做
<xsl:for-each select="collection(....)/saxon:discard-document(.)//testsuites">
...
</xsl:for-each>
答案 1 :(得分:3)
尝试使用saxon:discard-document
释放内存。
请参阅此博文:Using collection() and saxon:discard-document() to create reports