4

我整天都在寻找这个问题的答案。我正在为中等大小的 XML 文档(~1.5MB,~1000 个元素)创建样式表,这给我带来了很多麻烦。它是关于为不同的加工厂设备创建事件时间线图。XML 通过 SAP MII QueryTempalte 生成,格式为 /Rowsets/Rowset/Row。所有这些数据都以 /Equipments/Equipment/Event 格式处理并存储在本地节点集中。然后将此节点集处理为 HTML,然后在浏览器中呈现。现在,我开始遇到一些麻烦。我可以轻松地提取过去 5 天的数据,从而从 MII 中提取约 900 行数据,并处理为我的节点格式,从而产生略低于 900 行的数据。但是第二次我从 MII 获取了 1017 行,样式表只会呈现大约一半,然后停止并出现“没有更多可用的 DTM ID”异常。现在,MII 服务器只运行 JDK 1.5.x,而且我读过,这可能是个问题——唯一的问题是,我对此无能为力。所以现在我在这里问:有没有办法优化我的代码?我为我的 XSL 和一个示例 XML 附加了一些链接。

XSL:http : //pastie.org/1566517 Samlpe XML:http ://pastie.org/1566522

现在,示例 XML 可能不会产生任何“有趣”的视觉结果,并且无法复制错误。但是,如果有人能发现一个明显的优化,我很想知道:) 我一直在想,替换/移动 startOffset、endOffset 等的计算会很好,但我不知道怎么做。

希望可以有人帮帮我!:)

4

2 回答 2

5

后续行动

我们在不同的应用程序中也遇到了这个问题,错误的基础是相同的。正如上面提到的,根本问题是xalan的限制,Apache 项目用于处理xslt文档。该限制虽然很少触发,但由于用尽了最大数量的 65535(16 位)DTM id。在上述应用程序中,显然是通过使用 SAP 中的资源分配效率特性来避免这种情况的,但这不适用于其他应用程序,例如我们正在使用的应用程序。

改变 Xalan

总之,65K DTM id 限制已经存在了一段时间(约 2003 年),被修补,然后在2.7分支中丢失了补丁。当前最新版本的 2.7.2 存在此问题。在最基本的层面上,文档 ID 是一个 32 位整数。修复是增加了为 DTM 预留的位数的源代码更改。更彻底的讨论可以在这里查看。建议的技巧是将节点位数更改为 12,从而将 DTM 的位数增加到 20,将总 DTM 增加到 1048576。步骤是

  • 下载xalan源
  • 通过修改设置IDENT_DTM_NODE_BITS.
  • 建造xalan。您可能需要安装 ant 并适当地设置类路径。新jar将位于构建目录中。
  • 将之前的 xalan jar替换 为刚刚构建的那个。
于 2016-12-21T23:54:24.097 回答
2

知道这个问题很老,但我自己也遇到了同样的问题,对于那些也发现这个问题的人来说,似乎有一个 SAP Note 详细说明了一个可以解决这个问题的 JVM 补丁:

注意#1604623

https://websmp130.sap-ag.de/sap(bD1lbiZjPTAwMQ==)/bc/bsp/spn/sapnotes/index2.htm?numm=1604623

注释中的修复之一是:

改进了 XSLT 转换的资源消耗。我们修复了 XSLT 处理中的资源泄漏,该泄漏将导致使用(递归)模板的复杂 XSL 出现错误“DTMException:没有更多的 DTM ID 可用”。问题的原因是处理步骤的中间结果存储在 DTM 中,并且 DTM 的数量限制为 65536。

通过此更改,有一个新的系统属性“com.sap.jvm.xsltc.enableResourceOptimization”。如果此属性设置为“true”,XSLT 编译器将发布中间结果,因此需要更少的资源。应该可以处理复杂的 XSL。请注意,默认情况下未设置此系统属性。

于 2012-04-20T07:35:23.633 回答