我经常使用这个xpath sum(preceding::*/string-length())。
它完成了我需要它做的事情(在XML文件中提供到这个上下文的所有文本的字符计数)。
问题:它是缓慢的。
是否有不同的内置功能,我应该使用吗?还是分机?
更新:
基于Michael的评论,我研究了XSLT3.0 <accumulator>。这是我第一次尝试使用3.0 (我必须更新OxygenXML才能使其工作)。我还没有完全适应我的需求,但下面的初步测试显示了希望。
<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”标记。
发布于 2013-12-21 15:18:14
如果在每个节点上调用此函数,那么样式表的性能将是节点数中的O(n^2)。
这个函数无论如何都是不正确的。前轴给出了父母的前兄弟姐妹和父兄弟姐妹的子女,所以表亲的字符串长度被计算了不止一次。
尝试定义一个备忘录函数,如下所示:
<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累加器,这相当于相同的事情。
发布于 2013-12-21 12:24:00
我不认为sum函数是缓慢的,导航到所有前面的元素和计算所有内容的字符串长度都是昂贵的。至于优化它,您使用的是哪个XSLT2.0处理器?
https://stackoverflow.com/questions/20718823
复制相似问题