gpt4 book ai didi

java - 改进 XSLT 转换

转载 作者:数据小太阳 更新时间:2023-10-29 02:52:16 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com