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. 1 6. 6 10. 10
  2. 2 7. 7 11.11
  3. 3 8. 8 12.12
  4. 4 9. 9 13.13

列数が4の場合

  1. 1 5. 5 8. 8 11.11
  2. 2 6. 6 9. 9 12.12
  3. 3 7. 7 10. 10 13. 13

ループを必要とするロジックが1つありますが、より体系的なソリューションが必要です。xslt1.0のみを使用できます。

私のソリューションのロジックは

3列に分割する必要がある場合は

Mod = totalItem Mod Total_No_Columns;
quotient = floor(totalItem div Total_No_Columns);
for(i = 1 to 3)
{

テンプレートGenerateOLをparam(i、Mod、total items、quotient)で呼び出す
}

テンプレートコード
GenerateOL
{


    Var addFactor = maximum((i-1)、Mod)

    var startPosition =(quotient(i-1)+1 + addFactor);
    var endPosition = addFactor + quote * i +(i> = mod)?1:0;
    位置startPositionを使用してリンクteplateを呼び出し、Positionを終了します。

}

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>

4を指定する$pNumColsと、変換は再び正しい結果を生成します。

<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を生成しようとします。 ()mod 4=1。

于 2013-01-04T11:06:55.923 に答える