改进XSLT转换

时间:2011-01-20 13:39:07

标签: java xml xslt saxon

我有很多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>

但是我的堆空间仍然出错。难道我做错了什么?

2 个答案:

答案 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