1

我在按列划分元素时遇到问题。我有一个锚点列表,我必须在列中显示,列数是可配置的

说我们有以下

<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. 六 10. 十
  2. 二七七十一十一
  3. 三 8. 八 12. 十二
  4. 四 9. 九 13. 十三

如果列数为 4

  1. 一 5. 五 8. 八 11. 十一
  2. 二六六九九十二十二
  3. 三 7. 七 10. 十 13. 十三

我有一个需要循环的逻辑,但想要更系统的解决方案。只能使用 xslt 1.0。

我的解决方案的逻辑是

如果我必须分成 3 列然后

Mod= totalItem Mod Total_No_Columns;
商=楼(totalItem div Total_No_Columns);
for(i=1 到 3)
{

使用参数调用模板 GenerateOL (i, Mod, total items, quotient)
}

模板代码
GenerateOL
{


    var addFactor = maximum((i-1), Mod)

    var startPosition=(quotient(i-1)+1 + addFactor);
    var endPosition=addFactor+quotient*i + (i>=mod)?1:0;
    使用位置 startPosition 调用链接 teplate 到结束位置。

}

4

2 回答 2

2

这种转变

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

应用于提供的 XML 文档时:

<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>
于 2013-01-04T13:09:01.110 回答
0

试试这个逻辑

如果您有 10 个链接并且必须在 3 列中显示它们,则首先将它们除以 10 除以 3 = 3.33 取结果的上限,即 4 所以取 a=4 现在在每个项目上尝试仅在其位置时生成 OL () 模 4 = 1。

于 2013-01-04T11:06:55.923 回答