For each: get every third element (broken into 3 columns)

I have the following nodes in xsl:

<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> 

And would like to turn it into the following 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> 

Having difficulty figuring out how to loop and get every third element, I would like to do something like this:

 <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 

You may need to use last (), but it doesn’t work correctly.

+4
source share
2 answers

In XPath, the condition will be:

 not(position() mod 3) 

or

 position() mod 3 = 0 

I do not understand why you cannot use op:mod .

EDIT : About the new question , just subtract the offset. So:

X1:

 position() mod 3 = 1 

X2:

 position() mod 3 = 2 

X3:

 position() mod 3 = 0 

EDIT 2 : Now I understand your question.

+5
source

Try [position () mod 3 = 1]

0
source

All Articles