1

私の入力XMLドキュメントは、アイテムの単純なリストです。アイテムの数は任意です。

<items>
  <item name="item1"/>
  <item name="item2"/>
  <item name="item3"/>
  ...
  <item name="itemX"/>
</items>

ここで、このリストをHTMLテーブルに分割したいと思います。行と列の数は、パラメーター値として指定されます。

<xsl:param name="rows"/>
<xsl:param name="cols"/>

行を3、列を2とすると、結果のHTMLは次のようになります。

<table>
  <tr>
    <td>item1</td>
    <td>item2</td>
  </tr>
  <tr>
    <td>item3</td>
    <td>item4</td>
  </tr>
  <tr>
    <td>item5</td>
    <td>item6</td>
  </tr>
</table>

<table>
  <tr>
    <td>item7</td>
    <td>item8</td>
  </tr>
  <tr>
    <td>item9</td>
    <td>item10</td>
  </tr>
  <tr>
    <td>item11</td>
    <td>item12</td>
  </tr>
</table>
...

<table>したがって、作成されるの数は次のようになります。ceil(number_of_items / rows / cols)

私はこれを解決するための基本的な考えを持っていますが、最後の微調整を正しく行うことができないようです。次のスタイルシートは、私が望むものに近いものを生成しますが、項目4、7、10、および13が重複しています。誰かがこれを行う方法についてより良いアイデアを持っていますか?

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:param name="cols" select="2"/>
<xsl:param name="rows" select="3"/>

<xsl:template match="/*">
  <html>
    <head/>
    <body>
      <xsl:apply-templates select="*[position() mod ($cols * $rows) = 1]" mode="table"/>
     </body>
   </html>
</xsl:template>

<xsl:template match="*" mode="table">
    <table border="1" id="{@name}">
        <xsl:apply-templates select="." mode="row"/>
        <xsl:apply-templates select="following-sibling::*[position() &gt; 1 and position() mod $rows = 0]" mode="row"/>
     </table>
</xsl:template>

<xsl:template match="*" mode="row">
    <tr id="{@name}">
       <xsl:apply-templates select="." mode="cell"/>
       <xsl:apply-templates select="following-sibling::*[position() &lt; $cols]" mode="cell"/>
    </tr>
</xsl:template>

<xsl:template match="*" mode="cell">
    <td>
        <xsl:apply-templates select="."/>
    </td>
</xsl:template>

<xsl:template match="item">
    <xsl:value-of select="@name"/>
</xsl:template>

</xsl:stylesheet>
4

2 に答える 2

1

次のように $cols に +1 を追加してみてください。

<xsl:template match="*" mode="row">
<tr id="{@name}">
   <xsl:apply-templates select="." mode="cell"/>
   <xsl:apply-templates select="following-sibling::*[position() &lt; ($cols +1)]" mode="cell"/>
</tr>
</xsl:template>

テーブル テンプレートでこれを試してください (テーブルごとのアイテムの量を制限する必要があります)。

<xsl:template match="*" mode="table">
<xsl:variable name="mypos" select="position()"/>
<table border="1" id="{@name}" test="{$mypos}">
    <xsl:apply-templates select="." mode="row"/>
    <xsl:apply-templates select="following-sibling::*[position() &gt; 1 and position() mod  $rows = 0 and position() &lt; $mypos * ($cols * $rows)]" mode="row"/>
 </table>

于 2012-10-10T08:17:07.703 に答える
1

完全な変換は次のとおりです。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="pRows" select="3"/>
 <xsl:param name="pCols" select="2"/>

 <xsl:variable name="vItemsInTable" select="$pRows*$pCols"/>

 <xsl:template match="/*">
       <xsl:apply-templates mode="table"
            select="*[position() mod $vItemsInTable =1]"/>
 </xsl:template>

 <xsl:template match="item" mode="table">
  <table>
   <xsl:apply-templates  mode="row" select=
    "(.|following-sibling::*)
       [not(position() > $vItemsInTable) and position() mod $pCols = 1]">
   </xsl:apply-templates>
  </table>
 </xsl:template>

 <xsl:template match="item" mode="row">
  <tr>
   <xsl:apply-templates select=
     ".|following-sibling::*[not(position() > $pCols -1)]"/>
  </tr>
 </xsl:template>

 <xsl:template match="item">
  <td><xsl:apply-templates select="@name"/></td>
 </xsl:template>
</xsl:stylesheet>

この変換が次の XML ドキュメントに適用されると(提供されたものは、より困難にするために拡張されます):

<items>
    <item name="item1"/>
    <item name="item2"/>
    <item name="item3"/>   ...
    <item name="item4"/>
    <item name="item5"/>
    <item name="item6"/>   ...
    <item name="item7"/>
    <item name="item8"/>
    <item name="item9"/>   ...
    <item name="item10"/>   ...
    <item name="item11"/>   ...
    <item name="item12"/>   ...
    <item name="itemX"/>
</items>

必要な正しい結果が生成されます。

<table>
   <tr>
      <td>item1</td>
      <td>item2</td>
   </tr>
   <tr>
      <td>item3</td>
      <td>item4</td>
   </tr>
   <tr>
      <td>item5</td>
      <td>item6</td>
   </tr>
</table>
<table>
   <tr>
      <td>item7</td>
      <td>item8</td>
   </tr>
   <tr>
      <td>item9</td>
      <td>item10</td>
   </tr>
   <tr>
      <td>item11</td>
      <td>item12</td>
   </tr>
</table>
<table>
   <tr>
      <td>itemX</td>
   </tr>
</table>
于 2012-10-10T12:47:57.470 に答える