用于在列中划分项的XSLT模板



我有一个在列中划分元素的问题。我有一个锚的列表,我必须显示在列和列的数量是可配置的

说我们在

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

  1. 一个,,,,,,6. 6,,,,,,10. 十个
  2. 两个,,,,,,7. 7,11. 十一
  3. 三个,,,8. 八,,,12. 十二个
  4. four ,,,,,9. 9,,,,13. 十三
  5. 5

如果列数为4

  1. one ,,,, 5。five ,,,8. eight ,,,,11. 十一
  2. two ,,,,6. six ,,,,9. nine ,,,,12. 十二个
  3. 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。

相关内容

  • 没有找到相关文章

最新更新