2009-06-01 92 views
0

有没有人使用累计最大值functoid并注意到性能问题?累计最大值,为每个父记录计算

摘要
如果想绘制一个字段的最大值,您可以使用functoid的累计最高。

问题
我们已经使用了一段时间后,我们发现在大文件的性能下降。

审视XSLT一个注意到的最大计算每个循环记录所做的......

一个可以移动计算到大父母,并指出在自定义XSL路径的新的XSLT,但我真的很想保留映射工具中映射的可能性。

有什么建议吗?

亲切的问候
马丁带来

http://martinbring.blogspot.com

+0

@Martin,你可以编辑并使你的问题更明确吗? – 2009-06-01 08:30:02

回答

3

通过消除累积最大和增加3个脚本functoid的,在做另一种方式的计算,问题就解决了。 映射时间减少了40倍。

11 Mb,10 000行,之前映射的200分钟现在映射在5分钟内。


一个脚本functoid,“内联XSLT呼叫模板”没有输入或输出,从EXSLT Math library found here含有库的MAX()部分。我不使用整个库,而是解压缩文件并“提取”max()模板。

<xsl:template name="GetMax"> 
    <xsl:param name="nodes" /> 

    <xsl:choose> 
     <xsl:when test="not($nodes)">NaN</xsl:when> 
     <xsl:otherwise> 
     <xsl:for-each select="$nodes"> 
      <xsl:sort data-type="number" order="descending" /> 
      <xsl:if test="position() = 1"> 
      <xsl:value-of select="number(.)" /> 
     </xsl:if> 
     </xsl:for-each> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

一个脚本functoid,“内联XSLT呼叫模板”没有输入或输出,含有选择在模板设置为计算

<xsl:variable name="var:MaxValueDate"> 
    <xsl:call-template name ="GetMax"> 
      <xsl:with-param name ="nodes" select="Root//Parent/ValueToCalculate" /> 
    </xsl:call-template> 
</xsl:variable> 

一个脚本functoid节点属性点的变量,带有一个输出的“内联XSLT”,使用该变量用其值填充输出元素。

<OutputElement> 
     <xsl:value-of select="$var:MaxValueDate" /> 
</OutputElement> 

瞧!