This is the mail archive of the xsl-list@mulberrytech.com mailing list .


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: how to group equal nodes by a it's position()


Dmitri,

This does, literally, what you asked for.

If you want HTML-like tables with rows and cells, you'd use <table> literal
result elements (instead of <table_n>), and add some template processing of
<call> elements (instead of copy-of).  One way of making table rows from a
list is shown in archived post:
     http://www.biglist.com/lists/xsl-list/archives/200109/msg01324.html

<xsl:template match="calls">
    <xsl:call-template name="make-tables"/>
</xsl:template>

<xsl:template name="make-tables">
    <xsl:param name="nth-item" select="1"/>
    <xsl:param name="table-number" select="1"/>
    <xsl:variable name="table-name"
select="concat('table_',$table-number)"/>
    <xsl:choose>
        <xsl:when test="$nth-item &gt; count(call)"/><!-- done -->
        <xsl:when test="$nth-item = 1">
            <!-- the first table, 10 items -->
            <xsl:element name="{$table-name}">
                <xsl:copy-of select="call[position() &lt;= 10]"/>
            </xsl:element>
            <xsl:call-template name="make-tables">
                <xsl:with-param name="nth-item" select="$nth-item + 10"/>
                <xsl:with-param name="table-number" select="$table-number +
1"/>
            </xsl:call-template>
        </xsl:when>
        <xsl:when test="count(call) - $nth-item &lt; 20">
            <!-- the last table, up to 20 items -->
            <xsl:element name="{$table-name}">
                <xsl:copy-of select="call[position() &gt;= $nth-item]"/>
            </xsl:element>
        </xsl:when>
        <xsl:otherwise>
            <xsl:element name="{$table-name}">
                <xsl:copy-of select="call[position() &gt;= $nth-item and
                         position() &lt; $nth-item + 15]"/>
            </xsl:element>
            <xsl:call-template name="make-tables">
                <xsl:with-param name="nth-item" select="$nth-item + 15"/>
                <xsl:with-param name="table-number" select="$table-number +
1"/>
            </xsl:call-template>
        </xsl:otherwise>
     </xsl:choose>
  </xsl:template>

Have fun,
Paul

----- Original Message -----
From: "Dmitri Ilyin" <dmitri.ilyin@memIQ.com>
To: "XSL-List@lists. mulberrytech. com (E-mail)"
<XSL-List@lists.mulberrytech.com>
Sent: Friday, September 28, 2001 12:15 PM
Subject: [xsl] how to group equal nodes by a it's position()


> Hi *,
>
> i have next xml:
>
> <calls>
>  <call>sme text</call>
>  <call>sme text</call>
>  <call>sme text</call>
>  <call>sme text</call>
>  <call>sme text</call>
>  <call>sme text</call>
>  <call>sme text</call>
>  <call>sme text</call>
>  <call>sme text</call>
>  <call>sme text</call>
>  .....
>  <call>sme text</call>
> </calls>
>
> i have to group the <call> by it's position()
> to get
> <table_1>
>  <call>some text</call>
>  from position 1 to 10 (10 elements in the table_1)
>  <call>some text</call>
> </table_1>
> <table_2>
>  <call>some text</call>
>   from position 11 to 25 (15 elements in table_2)
> </table_2>
> ....
> <table_n>
>  <call>some text</call>
>   from position 26 to 40 (15 elements in table_n)
> </table_n>
>
> <table_x>
>  <call>some text</call>
>   from position nnn to mmm (20 elements or less in table_x)
> </table_x>
>
> So I have 3 types of tables, with 10, 15, 20 elements.
> The number of call nodes in table 1 must be 10 and it must be first 10
> elements,
> the number of call nodes in tables 2 to n must be 15,
> the number of call nodes in last table must be 20 or less.
>
> the number of call elements can be different.
> eg i have 100 call elements
> so i have to put in the first table 10 elements,
> in the tables from 2..6 15 elements
> and in the last table 15 elements.
>
> If i have 106 elements i could put in last table 20 (and make the last
table
> complete)
> elements end still have ones more element,
> so i have to create one more table with 15 elements and put in the last
> table the last 6 elements.
>
>
> are there any solutions of that problem???
>
> thanks for advise
>
> Dmitri
>
>  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
>


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]