xsl:accumulator 如何用于 xsl:function 内部的某些缓存实现以加快评估速度?

How can xsl:accumulator be used for some caching implementation inside of a xsl:function to speed up evaluation?

在任何事情之前

嗨! 出于工业原因,我无法提供真实的代码示例,但我认为没有它我的问题很简单。我可以用"dummy"的代码训练,但是会比necessary.By的方式花费更长的时间,看看可以让你大致了解输入文件和我的问题。

上下文

我处理输入 xml 文档,其 "grammar" 涉及一些 "component/composite" 类型的关系,一般想法是声明如下实体:

- "A is a component"
- "B is a composite using A"
- "C is a composite using B"
- "D is a composote using C"

实体之间的这种关系 "A, B" 由带有 ID/IDREF 约束的属性承载。 中提供的demo,如果需要可以拿来演示

XSL 的用例

XSL 在该上下文中使用 已经完全工作的转换 在输入节点之间执行 "intensive criterion matching" 并生成单个输出文档 "summarizes"这些标准评估对每个相关节点的结果。

<xsl:function name="my:criterion" ...>
call my:criterion(A);
...
call my:criterion(B);
     | call my:criterion(A)
...
call my:criterion(C);
     |call my:criterion(B);
           | call my:criterion(A) 

call my:criterion(D);
     |call my:criterion(C);
           | call my:criterion(B)
                  | call my:criterion(A)

and so on ...

有问题

尽管我的 转换已经给出了预期的结果 ,但我需要一些 "deeper" 理解和更好的执行时间性能。优化转换的一种方法是在评估标准时实施一些 "result caching" 以避免对同一元素进行多次评估(记住:标准函数本质上是确定性的 ) 我认为 xsl:accumulator 可能会有任何帮助,但我只是发现了它们,而且我不确定是否可以在函数范围内使用它们。

预期

我认为您正在寻找的功能是

<xsl:function ... cache="yes">

这有效地将函数变成了一个 "memo function",它会记住先前调用的结果,并在使用相同参数重复调用该函数时反省它们。

对于某些受限制的情况,xsl:accumulator 可用于实现相同的效果,但仅限于 (a) 它是单个节点的函数,以及 (b) 该函数只能通过引用计算到同一文档中的先前节点。这是因为 xsl:accumulator 主要是为了方便流式传输而设计的。