2012-04-25 75 views
22

我非常新的XSLT和可能會從錯誤的角度看我的問題 - 從語言如C++和Java的未來。我希望有人能幫助我。認識第一循環運行在XSLT

我要打個電話迴路(的xsl:for-每個)在XSLT和做具體通過循環第一次運行的東西。在其他語言中,我會爲此使用狀態變量,但是我已經瞭解到,變量無法在XSLT中更改它們的值,所以我該如何解決這個問題?這是我想要做的。 if子句中的大寫部分當然是假的,代表了我的問題。

<xsl:for-each select="browser/value"> 
<xsl:if test="FIRST TIME IN LOOP"> 
    do something once 
</xsl:if> 

<xsl:value-of select="current()" /> 
</xsl:for-each> 

非常感謝! Henrik

回答

36

之外,我認爲最簡單的方法是檢查當前節點的位置。它也比檢查樹前要素的存在更快(仍然可以工作,如果xsl:sort被添加到循環):

<xsl:for-each select="browser/value"> 
    <xsl:if test="position()=1"> 
    do something here 
    </xsl:if> 
    <xsl:value-of select="blah"/> 
</xsl:for-each> 
2

這就是現在你是如何做到的 - 你需要停止思考作爲一個過程,並開始思考更多的遞歸。

(修改)

<xsl:for-each select="browser/value"> 
     <xsl:if test="not(preceding::value[parent::browser])"> 
       first post! 
     </xsl:if> 
     <xsl:value-of select="blah"/> 
    </xsl:for-each> 

即,如果是第一次,就會有之前什麼都沒有。然而,也有可能通過其他方式來做到這一點的循環

+0

根據上下文,還有其他一些方法,比如通過創建節點集和遍歷它們,計算出你在哪裏等等。關鍵是不要像過程語言那樣來思考循環 – Woody 2012-04-25 15:15:33

+0

非常感謝您的快速回答。這解決了它! – Henrik 2012-04-25 15:16:49

+0

@伍迪這是偉大的人!正是我在找什麼。 – 2016-08-11 19:54:21

3

儘量避免「時間」的思想。沒有第一次,因爲XSLT執行沒有及時排序。但是輸入序列中有第一個項目,並且可以通過測試position()= 1來確定何時處理序列中的第一個項目。