我有很多 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>
但我的堆空间仍然存在错误。难道我做错了什么?
最佳答案
您不需要将源对象传递给 Saxon:您可以在命名模板处开始转换。但是,这在 JAXP API(仅识别 XSLT 1.0)中不受支持 - 您最好切换到 s9api 接口(interface)以充分利用 Saxon 功能。
至于 saxon:discard-document(),我不确定您在跟帖中了解了多少。我会避免将文档集放在全局变量中。相反,做
<xsl:for-each select="collection(....)/saxon:discard-document(.)//testsuites">
...
</xsl:for-each>
关于java - 改进 XSLT 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4747793/