首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSLT/Xpath - sum函数性能

XSLT/Xpath - sum函数性能
EN

Stack Overflow用户
提问于 2013-12-21 12:07:05
回答 2查看 380关注 0票数 1

我经常使用这个xpath sum(preceding::*/string-length())

它完成了我需要它做的事情(在XML文件中提供到这个上下文的所有文本的字符计数)。

问题:它是缓慢的。

是否有不同的内置功能,我应该使用吗?还是分机?

更新:

基于Michael的评论,我研究了XSLT3.0 <accumulator>。这是我第一次尝试使用3.0 (我必须更新OxygenXML才能使其工作)。我还没有完全适应我的需求,但下面的初步测试显示了希望。

代码语言:javascript
复制
<xsl:output method="xml" />

<xsl:accumulator 
    name="f:string-summ"
    post-descent="f:accum-string-length"
    as="xs:integer"
    initial-value="0">
    <xsl:accumulator-rule 
        match="text/*" 
        new-value="$value + string-length()"/>
</xsl:accumulator>

<xsl:template match="text/*">
        <xsl:value-of select="f:accum-string-length()" />
</xsl:template>

关闭主题:堆栈溢出需要一个“XSLT3.0”标记。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-21 15:18:14

如果在每个节点上调用此函数,那么样式表的性能将是节点数中的O(n^2)。

这个函数无论如何都是不正确的。前轴给出了父母的前兄弟姐妹和父兄弟姐妹的子女,所以表亲的字符串长度被计算了不止一次。

尝试定义一个备忘录函数,如下所示:

代码语言:javascript
复制
<xsl:function name="f:preceding-string-length" saxon:memo-function="yes">
  <xsl:param name="n" as="element()"/>
  <xsl:sequence select="sum(ancestor::*/preceding-sibling::*[1]/(f:preceding-string-length(.) + string-length(.)))"/>
</xsl:function>

或者使用XSLT3.0累加器,这相当于相同的事情。

票数 0
EN

Stack Overflow用户

发布于 2013-12-21 12:24:00

我不认为sum函数是缓慢的,导航到所有前面的元素和计算所有内容的字符串长度都是昂贵的。至于优化它,您使用的是哪个XSLT2.0处理器?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20718823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档