【发布时间】:2011-02-19 04:47:09
【问题描述】:
我正在使用下面的 XSL 2.0 代码来查找包含我作为输入提供的索引列表的文本节点的 ID。该代码运行良好,但就性能而言,大型文件需要很长时间。即使对于大文件,如果索引值很小,那么结果在几毫秒内很快。我正在使用 saxon9he Java 处理器来执行 XSL。
<xsl:variable name="insert-data" as="element(data)*">
<xsl:for-each-group
select="doc($insert-file)/insert-data/data"
group-by="xsd:integer(@index)">
<xsl:sort select="current-grouping-key()"/>
<data
index="{current-grouping-key()}"
text-id="{generate-id(
$main-root/descendant::text()[
sum((preceding::text(), .)/string-length(.)) ge current-grouping-key()
][1]
)}">
<xsl:copy-of select="current-group()/node()"/>
</data>
</xsl:for-each-group>
</xsl:variable>
在上述解决方案中,如果索引值太大,例如 270962,则 XSL 执行所需的时间为 83427 毫秒。在大文件中,如果索引值很大,例如 4605415、4605431,则需要几分钟才能执行。似乎变量“插入数据”的计算需要时间,尽管它是一个全局变量并且只计算一次。应该添加 XSL 还是处理器?如何提高 XSL 的性能。
【问题讨论】: