2010-07-27 33 views
24

我對xlst比較陌生,並且對是否有任何方式來存儲值並稍後進行更改(例如,在循環中增加一個變量)感到困惑。在XSLT中增加一個值

我有點困惑,因爲不能改變它的值後,它的設置對我來說沒有意義,使它更多的是一個常數。

比如我想做的事情是這樣的:

<xsl:variable name="i" select="0" /> 
<xsl:for-each select="data/posts/entry"> 
    <xsl:variable name="i" select="$i + 1" /> 
    <!-- DO SOMETHING --> 
</xsl:for-each> 

如果任何人都可以見識一下是否有這樣做
感謝

+0

感謝Dimitre,我沒有意識到變量可以在for-each循環中重用。我的問題實際上比我發佈的例子複雜得多,我找到了一個使用遞歸的解決方案,但是我會用你的建議看看更優雅的解決方案 – DonutReply 2010-07-29 12:14:37

+1

@Oliver雖然遞歸是通用的,但是有一些方法可以用遞歸替換迭代。這樣可以優化時間和空間 - xslt應用程序。 – 2010-07-29 12:40:19

回答

28

XSLT是一種功能性的語言和除其他事項外,這意味着變量在XSLT是不可變的和onc e他們已經確定他們的價值不能改變。

下面是同樣的效果可以在XSLT來實現:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/"> 
    <posts> 
    <xsl:for-each select="data/posts/entry"> 
     <xsl:variable name="i" select="position()" /> 
     <xsl:copy> 
     <xsl:value-of select="concat('$i = ', $i)"/> 
     </xsl:copy> 
    </xsl:for-each> 
    </posts> 
</xsl:template> 
</xsl:stylesheet> 

當這種轉變是在下面的XML文檔應用:

<data> 
<posts> 
    <entry/> 
    <entry/> 
    <entry/> 
    <entry/> 
    <entry/> 
</posts> 
</data> 

結果是

<posts> 
    <entry>$i = 1</entry> 
    <entry>$i = 2</entry> 
    <entry>$i = 3</entry> 
    <entry>$i = 4</entry> 
    <entry>$i = 5</entry> 
</posts> 
1

我遇到了我自己兩年替代方法前。你需要爲此使用遞歸。我忘了確切的語法,但這個網站可能會有所幫助:

Tip: Loop with recursion in XSLT

戰略工作基本如下:使用模板「方法」替換for循環。有沒有收到參數i。在模板方法中執行for循環的正文。如果i > 0i - 1作爲參數再次調用模板方法(遞歸)。

僞代碼:

for i = 0 to 10: 
    print i 

變爲:

def printer(i): 
    print i 
    if i < 10: 
     printer(i + 1) 
printer(0) 

請注意,在xsl:for-each使用position()(見其他答案),可以更簡單,如果你想要做的是有一個變量增量。如果您想要更復雜的循環/條件,請使用此處說明的那種遞歸。

5

可以使用position()功能:

<xsl:for-each select="data/posts/entry"> 
    <xsl:text> 
    Postion: ' 
    </xsl:text> 
    <xsl:value-of select = "position()" /> 
    <xsl:text> 
    ' 
    </xsl:text> 
    <!-- DO SOMETHING --> 
</xsl:for-each>