2

我有很多想要用 Xslt 2.0 转换的 xml(JUnit 测试结果)。

我目前正在使用 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>

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

4

2 回答 2

4

您不需要将源对象传递给 Saxon:您可以在命名模板处开始转换。然而,这在 JAXP API(仅识别 XSLT 1.0)中不受支持 - 您最好切换到 s9api 接口以充分利用 Saxon 功能。

至于 saxon:discard-document(),我不确定从跟踪线程中你能走多远。我会避免将一组文档放在全局变量中。相反,做

<xsl:for-each select="collection(....)/saxon:discard-document(.)//testsuites">
  ...
</xsl:for-each>
于 2011-01-20T16:39:08.083 回答
3

尝试使用saxon:discard-document释放内存。

请参阅此博客文章:使用 collection() 和 saxon:discard-document() 创建报告

于 2011-01-20T13:56:55.757 回答