XSLT Speed Difference Sum(PATH) 与用于调用模板优化的 $variable

XSLT Speed Difference Sum(PATH) vs. $variable for call-template optimization

我有一个缓慢的 XSL 模板,我正在寻找任何机会进行优化:

<!-- Ending columns for budget : called with P_LEDGER_TYPE == 'budget' -->
<xsl:template name="budget-special-cols">
  <!-- large pool of financial data -->
  <xsl:param name="cat"/>

  <xsl:param name="periods"/>
  <xsl:param name="sign" select="1"/>

  <!-- large pool of data for year over year budget -->
  <xsl:param name="yoy_budget"/>

  <!-- subsections of $cat based off of period of each row -->
  <xsl:param name="last_period" select="$cat[PERIOD=$periods[last()]]"/>
  <xsl:param name="trend_avg"   select="$cat[not(PERIOD=$periods[last()]) and not(PERIOD=$periods[1])]"/>
  <xsl:param name="trend_avg_len" select="P_REPORT_LEN - 2"/>

         <td class="ta-r"><xsl:value-of select="format-number(
           $sign * (sum($trend_avg/BUDGET) div $trend_avg_len)
           , '###,##0.00')"
         /></td>

         <td class="ta-r"><xsl:value-of select="format-number(
           (sum($trend_avg/BUDGET) div $trend_avg_len) - sum($last_period/BUDGET)
           , '###,##0.00')"
         /></td>

         <td class="ta-r"><xsl:value-of select="
           if ((sum($trend_avg/BUDGET) div $trend_avg_len)=0) then (0) 
           else format-number(
             ($sign * ((sum($trend_avg/BUDGET) div $trend_avg_len) - sum($last_period/BUDGET)) div (sum($trend_avg/BUDGET) div $trend_avg_len))*100
             , '###,##0.0')"
         />%</td>

         <td class="ta-r"><xsl:value-of select="format-number(
             $sign * (sum($last_period/BUDGET) - sum($yoy_budget/BUDGET))
             , '###,##0.00')"
         /></td>

         <td class="ta-r"><xsl:value-of select="
           if (sum($yoy_budget/BUDGET)=0) then (0) 
           else format-number(
                ($sign * (sum($yoy_budget/BUDGET) - sum($last_period/BUDGET)) div sum($yoy_budget/BUDGET))*100
                , '###,##0.0')"
         />%</td>
</xsl:template>

$cat$yoy_budget 代表 xml 组,其中有许多不同的帐户。

我的问题是:由于我正在总结几个大型数据池,是否最好像这样为多个 sum() 调用创建变量:

  . . .
  <!-- summed in call-template -->
  <xsl:param name="yoy_budget"/>

  <!-- subsections of $cat for based off of period for each row -->
  <xsl:param name="last_period" select="sum($cat[PERIOD=$periods[last()]]/BUDGET)"/>
  <xsl:param name="trend_avg"   select="sum($cat[not(PERIOD=$periods[last()]) and not(PERIOD=$periods[1])]/BUDGET)"/>
  <xsl:param name="trend_avg_len" select="P_REPORT_LEN - 2"/>
  . . .

或者还有其他我遗漏的明显优化技术吗?谢谢。

sum($trend_avg/BUDGET)sum($last_period/BUDGET) 等表达式似乎被多次使用,因此您当然可以尝试将它们中的每一个都存储在一个变量中以查看是否可以提高性能。

至于其他可能的优化,$cat[PERIOD=$periods[last()]] 似乎是一个查找,因此也许可以使用 PERIOD 上的键索引您在 $cat 中拥有的元素,例如<xsl:key name="cat-by-period" match="CATEGORY" use="PERIOD"/> 然后使用 key('cat-by-period', $periods[last()]) 而不是 $cat[PERIOD=$periods[last()]] 可以改善情况。我以元素 name/match 模式 CATEGORY 为例,您没有显示输入结构,所以我不知道确切的名称,也不知道该名称的简单匹配是否足够。