This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Re: [newbie]use of xsl:if {RE: XSL to handle display mutiple pages}
- To: xsl-list at mulberrytech dot com
- Subject: Re: [newbie]use of xsl:if {RE: XSL to handle display mutiple pages}
- From: Mike Brown <mike at skew dot org>
- Date: Fri, 3 Nov 2000 13:23:52 -0400 (EST)
- CC: XXu at CommercialWare dot com
- Reply-To: xsl-list at mulberrytech dot com
Xu, Xiaocun wrote:
> I started working on XSL to handle display mutiple pages in HTML. The
> idea I tried was simple, count number of records until max records per page
> reaches. At that time, I close of the current page/table, add a page break
> and start the next page/table. But such logic seems does not seems to be
> allowed in xsl blocks such as xsl:if. What can be done to get around this
> problem?
> Following is the XSL code I currently have problem with:
>
> <xsl:for-each select="//item">
> <tr><!--Display item record here--></tr>
> <xsl:param name="ItemCount" select="$ItemCount+1"/>
> <xsl:if test="$ItemCount=$maxItemsPage">
> <!-- end this table and page -->
> </tbody>
> </table>
> <!-- add page break at end of page -->
> <div style='page-break-before: always'> </div>
> <!-- start the next page with new table -->
> <table width="100%" border="1" cellspacing="0">
> <xsl:apply-templates select="tableheader"/>
> <tbody>
> </xsl:if>
> </xsl:for-each>
See the FAQ in the 'Tables' section. #3.
Note that //item will be inefficient; you might do better to select
/path/from/root/to/all/item.
I also assume you really wanted to do a call-template for a named template
named 'tableheader'... unless you have 'tableheader' elements in your XML?
<xsl:variable name="maxItemsPage" select="50"/>
<xsl:variable name="items" select="//item"/>
<!-- start a new table for item 1, 51, 101, 151, etc. -->
<xsl:for-each select="$items[(position()+1) mod $maxItemsPage + 1 = 1]"
<table width="100%" border="1" cellspacing="0">
<xsl:call-template name="tableheader"/>
<tbody>
<!-- start a new row for current item and the next 49 -->
<xsl:variable name="currentPos" select="position()"/>
<xsl:for-each select="$items[position() >= $currentPos and position() < $currentPos + $maxItemsPage -1]">
<tr>
<td>
<xsl:value-of select="."/> <!-- or whatever -->
</td>
</tr>
</xsl:for-each>
</tbody>
</table>
<!-- output separator if we're not on the last item in the set -->
<xsl:if test="$currentPos + $maxItemsPage > count($items)">
<div style='page-break-before: always'/>
</xsl:if>
</xsl:for-each>
- Mike
____________________________________________________________________
Mike J. Brown, software engineer at My XML/XSL resources:
webb.net in Denver, Colorado, USA http://www.skew.org/xml/
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list