2012-02-09 3 views
0

Допустим, мы имеем следующие данные:Как я могу группировать однородные данные в xsl?

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

Самый элегантный, XSLT-иш способ сгруппировать эти элементы? Например, представьте, что нам нужна таблица с двумя ячейками в каждой строке. Сверху моей головы я могу себе представить (не проверено) в шаблоне, соответствующий предмет, я могу назвать этот самый предмет, выбрав следующий-братьев. Но даже в этом случае я должен передать дополнительный параметр, чтобы сделать рекурсию конечной.

+0

возможно дубликат [Как я могу разбить строку таблицы в XSL после определенного кол?] (Http://stackoverflow.com/questions/377377/how-can-i-break-a-table- row-in-xsl-after-a-defined-count) – Tomalak

ответ

0

В строке подсчета может быть переменным .. я передать его в качестве паров к шаблону .. :)

<?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 изменяется, то ее '