2012-02-09 2 views
0

は、我々はデータを以下しているとしましょう:xslで同種のデータをグループ化するにはどうすればよいですか?

<all> 
    <item id="1"/> 
    <item id="2"/> 
    ... 
    <item id="N"/> 
</all> 

グループに最もエレガントな、XSLTっぽい方法は、これらのアイテムは何ですか? たとえば、各行に2つのセルがあるテーブルが必要な場合を考えてみましょう。 私の頭の上から私は想像することができます(しかし、テストされていません) テンプレートには、一致するアイテム、私はこの兄弟を選択するこのアイテムを呼び出すことができます。 しかし、この場合でも、再帰を有限にするために、追加のパラメータを渡す必要があります。

+0

可能重複[Iは、指定されたカウントの後に、XSLでテーブルの行を破ることができる方法は?](http://stackoverflow.com/questions/377377/how-can-i-break-a-table- xsl-after-a-specified-count) – Tomalak

答えて

0

行数は可変とすることができるように..テンプレートにPARAMとしてそれを通過してい.. :)

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" indent="yes"/> 

    <xsl:template match="/all[node]"> 
    <table> 
     <xsl:for-each select="node[1]"> 
     <xsl:call-template name="whoaa"> 
      <xsl:with-param name="count" select="'1'"/> 
      <xsl:with-param name="row_count" select="'10'"/> 
      <!--maximum row_count is set to 10 --> 
     </xsl:call-template> 
     </xsl:for-each> 
    </table> 
    </xsl:template> 

    <xsl:template name="whoaa"> 
    <xsl:param name="count"/> 
    <xsl:param name="row_count"/> 
    <!--check if we have crossed row_count--> 
    <xsl:if test="not ($row_count &lt; $count)"> 
     <tr> 
     <td> 
      <xsl:value-of select="."/> 
     </td> 
     <td> 
      <!--copy next column--> 
      <xsl:for-each select="following-sibling::node[1]"> 
      <xsl:value-of select="."/> 
      </xsl:for-each> 
     </td> 
     </tr> 
     <!--Select next row .. call the same template untill we reach (row_count > count)--> 
     <xsl:for-each select="following-sibling::node[2]"> 
     <xsl:call-template name="whoaa"> 
      <xsl:with-param name="count" select="$count+2"/> 
      <xsl:with-param name="row_count" select="$row_count"/> 
     </xsl:call-template> 
     </xsl:for-each> 
    </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 
例えば
+0

はサンプルXMLをそのまま使用します。入力XMLの構造が変更されると、 '