Xml 如何将xsl:acculator用于xsl:function内部的某些缓存实现以加速计算? 首先

Xml 如何将xsl:acculator用于xsl:function内部的某些缓存实现以加速计算? 首先,xml,xslt,optimization,xslt-3.0,accumulator,Xml,Xslt,Optimization,Xslt 3.0,Accumulator,嗨! 出于工业方面的原因,我无法提供真实的代码示例,但我认为如果没有它,我的问题相当简单。我可以使用“虚拟”代码进行训练,但这需要更长的时间​​输入文档和我的问题 上下文 我处理的输入xml文档的“语法”涉及一些“组件/复合”关系,其总体思想是声明实体,如: - "A is a component" - "B is a composite using A" - "C is a composite using B" - "D is a composote using C" 实体“A,B”之间的这

嗨! 出于工业方面的原因,我无法提供真实的代码示例,但我认为如果没有它,我的问题相当简单。我可以使用“虚拟”代码进行训练,但这需要更长的时间​​输入文档和我的问题

上下文 我处理的输入xml文档的“语法”涉及一些“组件/复合”关系,其总体思想是声明实体,如:

- "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在该上下文中使用,转换已经完全工作,在输入节点之间执行“密集标准匹配”,并生成单个输出文档,该文档“总结”每个相关节点上的标准评估结果

  • 因为要匹配的标准的本质涉及遍历节点之间提到的关系,搜索可能涉及递归性,所以我在函数下实现了这些标准求值,比如
有问题的 尽管我的转换已经产生了预期的结果,但我希望在执行时间方面有一些“更深入”的理解和更好的性能。OTPImization转换的一种方法是在对标准进行评估时实现一些“结果缓存”,以避免对同一元素进行多次评估(请记住:标准函数本质上是确定性的) 我原以为xsl:acculator会有任何帮助,但我刚刚发现了它们,我不确定是否可以在函数的范围内使用它们

期望
  • 感谢您提供了一些关于如何实现函数调用缓存的提示,以及xsl:acculator如何在这方面发挥作用

  • 感谢您不要在“请提供一些示例代码”的简单回答中走得太快。我可以考虑使用“虚拟”代码,但是如果没有它们就可以快速得到答案,那么使用这些虚拟代码所花费的时间是不值得的


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

      <xsl:function ... cache="yes">
      
      
      
      这将有效地将函数转换为“memo函数”,该函数会记住以前调用的结果,如果使用相同的参数重复调用函数,则会将其返回


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

      我非常喜欢阅读它!非常感谢Michael,一如既往,他在XSL/Xpath/XML主题上提供了很大的帮助!我还没有尝试你的建议,但我会尽快更新讨论;)该死的,我得到警告SXWN9011:Memo函数在Saxon中不可用HE:attribute被忽略。。。无论什么你还有其他想法吗?@MysticTm,如果我没记错的话,只有Saxon 10支持备忘录功能,所以你需要转到最新版本(目前仅适用于Java)才能与他一起使用。谢谢Martin!这是个好消息,我明天会检查它在萨克森10上是否如预期的那样工作。米凯尔·凯,你自己和迪米特里·诺瓦切夫,一如既往,都是宝贵的帮助!照顾好你们三个;-)上帝啊它与撒克逊10 HE的预期效果一样!!感谢Martin关于Saxon(最近)主要发行版的提示,在该版本中,Michael给出的正确解决方案可以有效地部署
      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 ...
      
      <xsl:function ... cache="yes">