2011-08-15 10 views
1

私は何かする必要があります(xと呼ばれる)変数の列名でテーブルを作成することです。私が持っている問題は、tdに変わる可能性のあるフィールドのいずれかが、xと等しいcolspanを持つ「単一行アイテム」になる可能性があるということです。問題は、行の開始と終了を、XMLで必要とされる適切な書式設定規則と一貫性のある方法で取得することが難しいことです。ここで1列の行を使用した動的なhtmlテーブルの作成

データは次のようになります。

<status> 
    <section title=""> 
    <columns>3</columns> 
    <fields> 
     <field label="Label 1">test data 1</field> 
     <field label="Label 2">test data 2</field> 
     <field label="Label 3">test data 3</field> 
     <field singleRow="true" label="Label 4">test data 4</field> 
     <field label="Label 5">test data 5</field> 
     <field label="Label 6">test data 6</field> 
     <field label="Label 7">test data 7</field> 
     <field label="Label 8">test data 8</field> 
     <field label="Label 9">test data 9</field> 
     <field singleRow="true" label="Label 10">test data 10</field> 
     <field label="Label 11">test data 11</field> 
     <field label="Label 12">test data 12</field> 
     <field label="Label 13">test data 13</field> 
     <field label="Label 14">test data 14</field> 
    </fields> 
    </section> 

出力は以下のようにする必要があります:

 <table> 
     <tr> 
      <td>Label 1</td> 
      <td>test data 1</td> 

      <td>Label 2</td> 
      <td>test data 2</td> 

      <td>Label 3</td> 
      <td>test data 3</td> 
     </tr> 
     <tr> 
      <td>Label 4</td> 
      <td colspan='5'>test data 4</td> 
     </tr> 
     <tr> 
      <td>Label 5</td> 
      <td>test data 5</td> 

      <td>Label 6</td> 
      <td>test data 6</td> 

      <td>Label 7</td> 
      <td>test data 7</td> 
     </tr> 
     <tr> 
      <td>Label 8</td> 
      <td>test data 8</td> 

      <td>Label 9</td> 
      <td colspan='3'>test data 9</td> 
     </tr> 
     <tr> 
      <td>Label 10</td> 
      <td colspan='5'>test data 10</td> 
     </tr> 
     <tr> 
      <td>Label 11</td> 
      <td>test data 11</td> 

      <td>Label 12</td> 
      <td>test data 12</td> 

      <td>Label 13</td> 
      <td>test data 13</td> 
     </tr> 
     <tr> 
      <td>Label 14</td> 
      <td colspan='5'>test data 14</td> 
     </tr> 
    </table> 

に、このような方法で、グループ要素に方法はあります各行を出力するためのfor-eachグループを行うことができるでしょうか?私はグループバイで悩んだことがあるが、これを行う良い方法は見つけられていない。ルールはcount = x(上記の例では3)まで、または要素がsingleRow属性を持つまで、すべてのノードを現在のポイントからグループに分けることです。

あなたはこの問題に対して、どのようにエレガントな解決策があると思いますか?

答えて

0

うーん、あなたの要件ビットを読み違え、これはほとんど何をしたいん...私は今、外出する必要があるけれども、それはやや役に立てば幸い、しようとすると、後で戻ってきて、それを修正:)

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 

    <xsl:output method="xml" indent="yes" /> 

    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="field"> 
    <td><xsl:value-of select="@label" /></td> 
    <td><xsl:value-of select="text()" /></td> 
    </xsl:template> 

    <xsl:template match="fields"> 
    <tbody> 
     <xsl:for-each-group group-adjacent="exists(@singleRow)" select="*"> 
     <xsl:choose> 
      <xsl:when test="current-grouping-key() = true()"> 
      <tr> 
       <xsl:apply-templates select="current-group()" /> 
      </tr> 
      </xsl:when> 
      <xsl:otherwise> 
      <xsl:for-each-group select="current-group()" group-adjacent="position() lt 4"> 
       <tr> 
       <xsl:apply-templates select="current-group()" /> 
       </tr> 
      </xsl:for-each-group> 
      </xsl:otherwise> 
     </xsl:choose> 
     </xsl:for-each-group> 
    </tbody> 
    </xsl:template> 

    <xsl:template match="section"> 
    <xsl:variable name="max" select="number(columns) + 1" /> 
    <xsl:variable name="colspan" select="columns" /> 
    <table> 
     <caption><xsl:value-of select="@title" /></caption> 
     <tbody> 
     <xsl:for-each-group group-adjacent="exists(@singleRow)" select="fields/*"> 
      <xsl:choose> 
      <xsl:when test="current-grouping-key() = true()"> 
       <tr colspan="{$colspan}"> 
       <xsl:apply-templates select="current-group()" /> 
       </tr> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:for-each-group select="current-group()" group-adjacent="position() lt $max"> 
       <tr> 
        <xsl:apply-templates select="current-group()" /> 
       </tr> 
       </xsl:for-each-group> 
      </xsl:otherwise> 
      </xsl:choose> 
     </xsl:for-each-group> 
     </tbody> 
    </table> 
    </xsl:template> 

</xsl:stylesheet> 
関連する問題