java - 改进 XSLT 转换

标签 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>

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

最佳答案

您不需要将源对象传递给 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/

相关文章:

java - 如何防止通过JAXB解析Html格式的数据

c# - 如何将 XML 反序列化为 json 和将 json 反序列化为 c# 类?

xml - 带组的 xslt 转换

Java JButton 大小问题

Java 对对象的数组列表进行排序

java - 如何在 Javadocs 中引用 Lombok 生成的方法?

xml - 正则表达式:删除 xml 的空元素标记

java - 如果浏览器已停止,我怎样才能停止这个 JSP?

xslt - 如何使用 XSL 获取纯文本和换行符

xslt - 在xslt中找到2个日期之间的差异