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" ...>
- 因此,对于给定的节点 A,在树的遍历过程中,可能会多次评估 A 上的标准(但每个标准本质上都是确定性的!)。当运行时,transformatiom可能会产生如下一系列调用(伪代码)
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:accumulator 可以/不能用于该目的的提示。
感谢您在 "please provide some sample code" 简单的回答中没有说得太快。我可以想到要使用的 "dummy" 代码,但是如果没有它们也能获得快速答案,那么花在这些伪代码上的时间是不值得的!
我认为您正在寻找的功能是
<xsl:function ... cache="yes">
这有效地将函数变成了一个 "memo function",它会记住先前调用的结果,并在使用相同参数重复调用该函数时反省它们。
对于某些受限制的情况,xsl:accumulator
可用于实现相同的效果,但仅限于 (a) 它是单个节点的函数,以及 (b) 该函数只能通过引用计算到同一文档中的先前节点。这是因为 xsl:accumulator
主要是为了方便流式传输而设计的。
在任何事情之前
嗨!
出于工业原因,我无法提供真实的代码示例,但我认为没有它我的问题很简单。我可以用"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 约束的属性承载。
XSL 的用例
XSL 在该上下文中使用 已经完全工作的转换 在输入节点之间执行 "intensive criterion matching" 并生成单个输出文档 "summarizes"这些标准评估对每个相关节点的结果。
- 因为匹配标准的性质涉及遍历节点之间提到的关系,搜索可能涉及递归性所以我在函数下实现了这些标准评估,假设
<xsl:function name="my:criterion" ...>
- 因此,对于给定的节点 A,在树的遍历过程中,可能会多次评估 A 上的标准(但每个标准本质上都是确定性的!)。当运行时,transformatiom可能会产生如下一系列调用(伪代码)
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:accumulator 可以/不能用于该目的的提示。
感谢您在 "please provide some sample code" 简单的回答中没有说得太快。我可以想到要使用的 "dummy" 代码,但是如果没有它们也能获得快速答案,那么花在这些伪代码上的时间是不值得的!
我认为您正在寻找的功能是
<xsl:function ... cache="yes">
这有效地将函数变成了一个 "memo function",它会记住先前调用的结果,并在使用相同参数重复调用该函数时反省它们。
对于某些受限制的情况,xsl:accumulator
可用于实现相同的效果,但仅限于 (a) 它是单个节点的函数,以及 (b) 该函数只能通过引用计算到同一文档中的先前节点。这是因为 xsl:accumulator
主要是为了方便流式传输而设计的。