我有一个在列中划分元素的问题。我有一个锚的列表,我必须显示在列和列的数量是可配置的
说我们在
下面<links>
<link>one</link>
<link>two</link>
<link>three</link>
<link>four</link>
<link>five</link>
<link>six</link>
<link>seven</link>
<link>eight</link>
<link>nine</link>
<link>ten</link>
<link>eleven</link>
<link>twelve</link>
<link>thirteen</link>
</links>
要求是在有序列表中显示这些链接,结果如下所示如果列数为3
- 一个,,,,,,6. 6,,,,,,10. 十个
- 两个,,,,,,7. 7,11. 十一
- 三个,,,8. 八,,,12. 十二个
- four ,,,,,9. 9,,,,13. 十三 5
如果列数为4
- one ,,,, 5。five ,,,8. eight ,,,,11. 十一
- two ,,,,6. six ,,,,9. nine ,,,,12. 十二个
- three 7. seven ,10. 十,,,,,13. 十三 四
我有一个逻辑需要循环,但想要更系统的解决方案。只能使用xslt 1.0
逻辑我的解决方案是
如果我要分成三列,那么
Mod= totalItem Mod Total_No_Columns;
For (i=1 to 3)
{
使用参数(i, Mod, total items, quotient)调用模板GenerateOL
}
模板代码
GenerateOL
{
Var addFactor = maximum((i-1), Mod)
var startPosition=(quotient(i-1)+1 + addFactor);
var endPosition=addFactor+quotient*i + (i>=mod)?1:0;
调用链接模板与位置startPosition结束位置。
}
这一转换:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:param name="pNumCols" select="3"/>
<xsl:variable name="vCount" select="count(/*/*)"/>
<xsl:variable name="vRemainder"
select="$vCount mod $pNumCols"/>
<xsl:variable name="vPerCol" select="floor($vCount div $pNumCols)"/>
<xsl:template match="/*">
<table border="1">
<xsl:apply-templates select="*[not(position() > ceiling($vCount div $pNumCols))]"/>
</table>
</xsl:template>
<xsl:template match="link">
<xsl:variable name="vCurrentItem" select="."/>
<xsl:variable name="vRow" select="position()"/>
<tr>
<xsl:for-each select=
"(//node()|//namespace::*)[not(position() > $pNumCols)]">
<xsl:variable name="vColNo" select="position()"/>
<xsl:apply-templates mode="inGroup" select=
"$vCurrentItem/../*
[position() = ($vColNo -1)*$vPerCol+ $vRemainder
- ($vRemainder - $vColNo +1)*not($vColNo > $vRemainder)+ $vRow
]
[not($vRow > $vPerCol and $vColNo > $vRemainder)]"/>
</xsl:for-each>
</tr>
</xsl:template>
<xsl:template match="link" mode="inGroup">
<td><xsl:number count="link"/>. <xsl:copy-of select="text()"/></td>
</xsl:template>
</xsl:stylesheet>
<links>
<link>one</link>
<link>two</link>
<link>three</link>
<link>four</link>
<link>five</link>
<link>six</link>
<link>seven</link>
<link>eight</link>
<link>nine</link>
<link>ten</link>
<link>eleven</link>
<link>twelve</link>
<link>thirteen</link>
</links>
生成所需的正确结果:
<table border="1">
<tr>
<td>1. one</td>
<td>6. six</td>
<td>10. ten</td>
</tr>
<tr>
<td>2. two</td>
<td>7. seven</td>
<td>11. eleven</td>
</tr>
<tr>
<td>3. three</td>
<td>8. eight</td>
<td>12. twelve</td>
</tr>
<tr>
<td>4. four</td>
<td>9. nine</td>
<td>13. thirteen</td>
</tr>
<tr>
<td>5. five</td>
</tr>
</table>
如果我们指定$pNumCols
为4,转换再次产生正确的结果:
<table border="1">
<tr>
<td>1. one</td>
<td>5. five</td>
<td>8. eight</td>
<td>11. eleven</td>
</tr>
<tr>
<td>2. two</td>
<td>6. six</td>
<td>9. nine</td>
<td>12. twelve</td>
</tr>
<tr>
<td>3. three</td>
<td>7. seven</td>
<td>10. ten</td>
<td>13. thirteen</td>
</tr>
<tr>
<td>4. four</td>
</tr>
</table>
试试这个逻辑
如果你有10个链接,你必须在3列中显示它们,然后首先将它们分开10除以3等于3.33取结果的上限,也就是4取a=4现在,在每个项目上,只有当它的Position() mod 4 = 1时,才尝试生成OL。