2010-08-03 41 views
4

我在XSL以下節點:的for-each:讓每一個第3項(分成3列)

<foo> 
    <bar>1</bar> 
    <bar>2</bar>  
    <bar>3</bar> 
    <bar>4</bar>   
    <bar>5</bar> 
    <bar>6</bar>  
    <bar>7</bar> 
    <bar>8</bar>    
    <bar>9</bar> 
</foo> 

,並希望把它變成下面的HTML:

<ul class="one"> 
    <li>1</li> 
    <li>4</li> 
    <li>7</li> 
</ul> 
<ul class="two"> 
    <li>2</li> 
    <li>5</li> 
    <li>8</li> 
</ul> 
<ul class="three"> 
    <li>3</li> 
    <li>6</li> 
    <li>9</li> 
</ul> 

有一個很難搞清楚如何循環,讓每一個第三項,願做這樣的事情:

<ul class="one"> 
<xsl:for-each select="exlt:node-set($blah)/foo/bar[X1]"> 
    <li><xsl:value-of select="node()"/></li> 
</xsl:for-each> 
</ul> 

<ul class="two"> 
<xsl:for-each select="exlt:node-set($blah)/foo/bar[X2]"> 
    <li><xsl:value-of select="node()"/></li> 
</xsl:for-each> 
</ul> 

<ul class="three"> 
<xsl:for-each select="exlt:node-set($blah)/foo/bar[X3]"> 
    <li><xsl:value-of select="node()"/></li> 
</xsl:for-each> 
</ul> 

Where: 
X1 = Every third item starting from position 1 
X2 = Every third item starting from position 2 
X3 = Every third item starting from position 3 

可能需要使用最後的(),但不能完全正確地工作。

回答

5

在XPath,條件是:

not(position() mod 3) 

position() mod 3 = 0 

我不明白爲什麼你不能使用op:mod

編輯:關於新問題,只是減去偏移量。所以:

X1:

position() mod 3 = 1 

X2:

position() mod 3 = 2 

X3:

position() mod 3 = 0 

編輯2:現在我明白你的問題。

+0

想到我也可以使用mod,但是如何循環訪問其他列。用更多細節更新了問題。也許我只是錯過了一些非常明顯的東西。看看第2列應該是#s:2,5,8這些不是等於mod。 – 2010-08-03 19:38:48

+0

謝謝!我想我完全誤解了國防部做了什麼,認爲它只有1或0,取決於數字是否可以整除。只用於交替行。 – 2010-08-03 19:57:34

+1

@路易斯W:你好!從http://www.w3.org/TR/xpath/#numbers:「mod運算符返回來自截斷部分的餘數」。 – 2010-08-03 20:03:59

0

嘗試[position()mod 3 = 1]

+0

當然應該是0 :-) – schoetbi 2010-08-03 19:34:19