2017-02-05 14 views
1

最初の列の内容についてグループ化テーブル行を実行し、グループ内の各行に対して一定量の処理を実行する必要があります。最初の列の内容 - 数字。列に桁数が含まれていない場合は、for-each-groupに近づくでしょう。XSLT-2.0:ノード内容別グループ化

例では、入力:1,3,4:列の数1で

  • <table> 
     
        <tr><td>1</td></tr> 
     
        <tr><td>2</td></tr> 
     
        <tr><td>1</td></tr> 
     
        <tr><td>1,2,3</td></tr> 
     
        <tr><td>1,4</td></tr> 
     
    </table>

    タスクによれば、私は4つのグループを有していなければなりません、5行目。

  • 2桁目と4桁目の番号2。
  • 3番:4番;
  • 4:5th。 group-by = "td [1]"が動作しないように

    <xsl:template match="table"> 
     
        <xsl:for-each-group select="tr" group-by="td[1]"> 
     
        <xsl:for-each select="current-group()"> 
     
        <!-- transformation --> 
     
        </xsl:for-each> 
     
        </xsl:for-each-group> 
     
    </xsl:template>

一般的なテンプレートは次のようになります。
正規表現のキー...難しいと感じます。

答えて

2

<xsl:for-each-group select="tr" group-by="td[1]"><xsl:for-each-group select="tr" group-by="tokenize(td[1], ',')">に置き換えたように聞こえます。

0

私はあなたが入力として

  1. あなたは、行と列を持つテーブルを持っていることを言っていると思います。
  2. 各行の最初の列には、コンマ区切りの番号リストが含まれています。行には追加の列が含まれる場合がありますが、例には表示されていません。
  3. カンマ区切りのリストの最初の列のカンマ区切りリストにその数値を含む行からなる、数値のリストを区切って1つのグループにしたいとします。

最後の点から、最初の列のコンマ区切りリスト内の各数字に1回、またはそのリスト内の個別の値ごとに1回表示されます(明白ではありません)。

I(テストされていません。)

<xsl:for-each-group select="tr" 
    group-by="tokenize(td[1],',')"> 
    <xsl:message>Now processing <xsl:value-of 
     select="count(current-group()"/>rows containing <xsl:value-of 
     select="current-grouping-key()"/> in column 1.</ 
    ... 
</ 

を試してみた

0

あなたが出力する各グループの値を含む元の行番号が必要な場合、私はあなたがに入力を変換する必要があると思います元のposition()を含む別のデータ構造。このようなもの:

<xsl:template match="table"> 
    <xsl:variable name="row-data"> 
     <xsl:for-each select="tr/td"> 
      <xsl:variable name="row" select="position()" /> 
      <xsl:for-each select="tokenize(., ',')"> 
       <data> 
       <xsl:attribute name="row" select="$row" /> 
       <xsl:attribute name="value" select="." /> 
       </data> 
      </xsl:for-each> 
     </xsl:for-each> 
    </xsl:variable> 

    <data> 
     <xsl:for-each-group select="$row-data/*" group-by="@value"> 
     <group> 
      <xsl:attribute name="value" select="@value" /> 
      <xsl:value-of select="current-group()/@row" separator=","/> 
     </group> 
     </xsl:for-each-group> 
    </data> 
</xsl:template>