This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Re: how to group equal nodes by a it's position()
- To: <xsl-list at lists dot mulberrytech dot com>
- Subject: Re: [xsl] how to group equal nodes by a it's position()
- From: "Paul Tyson" <paul at precisiondocuments dot com>
- Date: Fri, 28 Sep 2001 13:45:12 -0700
- Organization: Precision Documents
- References: <07D07AD1C8CAD4119B0900D0B7E7E8E0649AEF@uhura.memiq.com>
- Reply-To: xsl-list at lists dot mulberrytech dot com
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 > 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() <= 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 < 20">
<!-- the last table, up to 20 items -->
<xsl:element name="{$table-name}">
<xsl:copy-of select="call[position() >= $nth-item]"/>
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:element name="{$table-name}">
<xsl:copy-of select="call[position() >= $nth-item and
position() < $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