以嵌套循环计数:更高效?

时间:2014-06-05 09:04:04

标签: xslt xslt-2.0

我有以下模板,带有嵌套循环。该模板在多个xml文件上生成页码(例如:20个文件=我书中的章节)。编号从@ start = 4开始。 $ pagenr是页面计数器。为了更有效地计算,我将以前文件的页数保留在$ prevPage中。然后我只是在内部循环中添加xml文件中的页数。 问题:这真的有效吗?或者内部循环中的$ prevPage计数是否已更新? 在处理内循环中的指令时,我看到XMLSpy调试器从内循环跳回到<xsl:variable name="prevPage" ....行。

<xsl:template match="lat:numberGroup">
<xsl:variable name="start" select="@start"/>
<xsl:variable name="format" select="@format"/>
<!-- newnav.xml must not be processed here, as it is being created -->
<xsl:for-each select="lat:entry[not(@pagenr) or not(@pagenr = 'no')]">
    <xsl:variable name="prevPage" select="number($start) + count((preceding-sibling::node())/document(lat:file)//lat:page)"/>
    <xsl:variable name="actFile" select="lat:file"/>
    <xsl:for-each select="document($actFile)//lat:page">
        <li>
            <a>
                <xsl:variable name="pagenr" select="number($prevPage) + count( ./preceding::lat:page  )"/>
                <xsl:attribute name="href">
                      <xsl:value-of select="tokenize($actFile,'\.')[1]"/>
                      .xhtml#pg
                      <xsl:value-of select="$pagenr"/>
                </xsl:attribute>
                <xsl:number value="$pagenr" format="{$format}"/>
            </a>
        </li>
    </xsl:for-each>
</xsl:for-each>
</xsl:template>

1 个答案:

答案 0 :(得分:0)

内部如何工作取决于您使用的是哪个XSLT处理器。但是,如果处理器采用的策略效率低于显而易见的策略,即在变量声明发生时评估变量,那么你就会非常幸运。正如Marcus Rickert所说,你可能会看到处理器试图做得比这更好,通过延迟对变量的评估直到需要它为止(例如,如果内部循环执行了零次则根本不需要它)。

顺便说一下,表达式tokenize($actFile,'\.')[1]也可以在内部循环之外进行计算。智能处理器将为您进行优化,但如果您想确定,可以通过创建另一个变量手动完成。