2014-06-05 59 views
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> 
+0

*跳回*可能是由XSLT處理器的延遲評估引起的。但是,由於XSLT *變量*只設置一次,之後永遠不會改變,隨後的任何後續跳回可能僅表明懶惰,並不代表實際的重新計算。 –

+0

[我如何計算XSLT執行時間到毫秒級精度?](http://stackoverflow.com/questions/8783696/how-do-i-time-my-xslt-execution-times-to-millisecond -準確性) –

回答

0

它在內部的工作原理取決於您使用的XSLT處理器。然而,如果處理器採用的策略效率低於明顯的策略,那就是在發生變量聲明的位置評估變量,那麼您就會非常失敗。正如Marcus Rickert所說,你可能會看到處理器試圖做得比這更好,通過推遲對變量的評估直到需要爲止(例如,如果內部循環執行零次,根本不需要)。

順便說一句,表達式tokenize($actFile,'\.')[1]也可以在內部循環之外進行評估。一個智能處理器會爲你做這種優化,但如果你想確定,你可以通過創建另一個變量手工完成。