[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

RE: [xsl] Incrementing a Global variable


Subject: RE: [xsl] Incrementing a Global variable
From: Rajendra S Rawat <rajsrawat@xxxxxxxxx>
Date: Tue, 26 Aug 2003 03:33:55 -0700 (PDT)

Hi! Michael 

I've formulated sample files to illustrate the
problem:
************************************************

Input XML file:(sample.xml)
---------------------------
<?xml version="1.0" encoding="UTF-8"?>
<Students>
	<Student>
		<Name>SAM</Name>
		<TOption>English </TOption>
	</Student>
	<Student>
		<Name>RAJ</Name>
		<TOption>English </TOption>
	</Student>
	<Student>
		<Name>RON</Name>
		<TOption>English </TOption>
	</Student>
	<Student>
		<Name>JON</Name>
		<TOption>German  </TOption>
	</Student>
	<Student>
		<Name>DON</Name>
		<TOption>German  </TOption>
	</Student>
	<Student>
		<Name>MON</Name>
		<TOption>Hebrew  </TOption>
	</Student>
	<Student>
		<Name>GON</Name>
		<TOption>Hebrew  </TOption>
	</Student>
</Students>
**********************************************

HTML Output:( I'm Getting)
------------
1 SAM English  
2 RAJ English  
3 RON English  
4   
4 JON German  
5 DON German  
6   
6 MON Hebrew  
7 GON Hebrew  
10 Total = 7  
11   
12   
13   
14   
15   

***********************************************

HTML Output:( I Require)
------------

1 SAM English  
2 RAJ English  
3 RON English  
4   
5 JON German  
6 DON German  
7   
8 MON Hebrew  
9 GON Hebrew  
10 Total = 7  
11   
12   
13   
14   
15   
****************************************

XSLT File: (sample.xslt)
------------------------
<?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" version="1.0"
encoding="UTF-8" indent="yes"/>
	<xsl:variable name="varRowLimit" select="15"/>
	<xsl:template match="Students">
		<xsl:variable name="Student_Count"
select="count(Student)"/>
		<xsl:variable name="BreakCount"
select="count(Student[not(TOption =
following-sibling::*/TOption)])"/>
		<html>
			<table >
				<xsl:for-each select="Student">
					<tr>
						<td>
							<xsl:choose>
								<xsl:when test="position() mod
$varRowLimit=0">
									<xsl:value-of select="$varRowLimit "/>
								</xsl:when>
								<xsl:otherwise>
									<xsl:value-of select="(position()  mod
$varRowLimit)"/>
								</xsl:otherwise>
							</xsl:choose>
						</td>
						<td>
							<xsl:value-of select="Name"/>
						</td>
						<td>
							<xsl:value-of select="TOption"/>
						</td>
					</tr>
					<xsl:variable name="CurrTOption"
select="TOption"/>
					<xsl:variable name="NextTOption"
select="following-sibling::*/TOption"/>
					<xsl:if test="not(position()=last())">
						<xsl:if test="not($NextTOption=$CurrTOption)">
							<xsl:call-template name="PrintBlankRows">
								<xsl:with-param name="start_count"
select="position()+1"/>
								<xsl:with-param name="no_of_BlankRows"
select="position()+2"/>
							</xsl:call-template>
						</xsl:if>
					</xsl:if>
					<xsl:if test="position()=last()">
						<tr>
							<td>
								<xsl:value-of select="($Student_Count
+$BreakCount ) mod  $varRowLimit "/>
							</td>
							<td>
								Total =	<xsl:value-of select="$Student_Count
"/>
							</td>
							<td>
								<xsl:text
disable-output-escaping="yes"><![CDATA[ ]]></xsl:text>
				
							</td>
						</tr>
						<xsl:variable name="no_of_BlankLines">
							<xsl:call-template name="RowsRemaining">
								<xsl:with-param name="ncount"
select="$Student_Count"/>
							</xsl:call-template>
						</xsl:variable>
						<xsl:call-template name="PrintBlankRows">
							<xsl:with-param name="start_count"
select="($Student_Count +$BreakCount + 1) mod 
$varRowLimit "/>
							<xsl:with-param name="no_of_BlankRows"
select="(($Student_Count +$BreakCount +1) mod 
$varRowLimit ) + ($no_of_BlankLines - $BreakCount) "/>
						</xsl:call-template>
					</xsl:if>
				</xsl:for-each>
			</table>
		</html>
	</xsl:template>
	<xsl:template name="PrintBlankRows">
		<xsl:param name="start_count"/>
		<xsl:param name="no_of_BlankRows"/>
		<xsl:if test="$start_count &lt; $no_of_BlankRows">
			<tr>
				<td>
					<xsl:value-of select="$start_count"/>
				</td>
				<td>
					<xsl:text disable-output-escaping="yes"><![CDATA[
]]></xsl:text>
				</td>
				<td>
					<xsl:text disable-output-escaping="yes"><![CDATA[
]]></xsl:text>	
								</td>
			</tr>
			<xsl:call-template name="PrintBlankRows">
				<xsl:with-param name="start_count"
select="$start_count + 1"/>
				<xsl:with-param name="no_of_BlankRows"
select="$no_of_BlankRows"/>
			</xsl:call-template>
		</xsl:if>
	</xsl:template>
	<xsl:template name="RowsRemaining">
		<xsl:param name="ncount"/>
		<xsl:choose>
			<xsl:when test="$ncount &lt;= $varRowLimit">
				<xsl:value-of select="$varRowLimit - $ncount "/>
			</xsl:when>
			<xsl:otherwise>
				<xsl:call-template name="RowsRemaining">
					<xsl:with-param name="ncount" select="$ncount -
$varRowLimit"/>
				</xsl:call-template>
			</xsl:otherwise>
		</xsl:choose>
	</xsl:template>
</xsl:stylesheet>
****************************************************

I am trying to implement multilple
transformation/node-set(). Because after first
transformation, I get  complex fo:block 's. So I doubt
this technique will help in my case.

Thanks & Regards,
Raj

PS: Thanks to Mukul(you got my problem.)Details are
given above.

--- Michael Kay <mhk@xxxxxxxxx> wrote:
> Your problem description isn't very clear, but at
> first sight it looks
> as if the problem could easily be solved by doing
> the numbering in a
> second pass, i.e. by creating a result tree and then
> using it as input
> to a second transformation by using xx:node-set().
> 
> Michael Kay
> 
> > -----Original Message-----
> > From: owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx 
> > [mailto:owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx] On
> Behalf Of 
> > Rajendra S Rawat
> > Sent: 25 August 2003 11:37
> > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> > Subject: [xsl] Incrementing a Global variable
> > 
> > 
> > This drawback of XSL/XSL:FO is quite frustating
> > 
> > 
> > 
> > I want something like this 
> > --------------------------------------
> > |Sl No | STUDENT NAME     | TOption   |
> > --------------------------------------
> > | 1    |  SAM             |  English  | <-
> > position()=1
> > --------------------------------------
> > | 2    |  RAJ             |  English  | <-
> > position()=2
> > --------------------------------------
> > | 3    |  RON             |  English  | <-
> > position()=3
> > --------------------------------------
> > | 4    |                  |           |
> > --------------------------------------
> > | 5    |  JON             |  German   | <-
> > position()=4
> > --------------------------------------
> > | 6    |  DON             |  German   | <-
> > position()=5
> > --------------------------------------
> > | 7    |                  |           |
> > -------------------------------------- 
> > | 8    |  MON             |  Hebrew   | <-
> > position()=6
> > --------------------------------------
> > | 9    |  GON             |  Hebrew   | <-
> > position()=7
> > --------------------------------------
> > | 10   | TOTAL= 7         |           |
> > --------------------------------------
> > | 11   |                  |           |
> > --------------------------------------
> > | 12   |                  |           |
> > --------------------------------------
> > | 13   |                  |           |
> > -------------------------------------- 
> > | 14   |                  |           |
> > --------------------------------------
> > | 15   |                  |           |
> > --------------------------------------
> > 
> > Pl. Note 
> > 1. the rows with out values
> > 2. position() is not same as Sl No.
> > 3. blank rows continues till end of page
> > 4. after first break diff between position() and
> Sl
> > No. is 1 (then after second break 2 ....)
> > 5. this is only a very tiny part of xml/output
> used to
> > just illustrate the problem, So I cannot use
> static
> > sl. no. (it is in a <xsl:for-each select="Student"
> > ..loop)
> > 
> > 
> > I have however created above table (breaks by
> grouping
> > and extra blank-rows by recursion)
> > 
> > but could not get Sl. No. ordered
> > I can get something like
> > --------------------------------------
> > |Sl No | STUDENT NAME     | TOption   |
> > --------------------------------------
> > | 1    |  SAM             |  English  | <-
> > position()=1
> > --------------------------------------
> > | 2    |  RAJ             |  English  | <-
> > position()=2
> > --------------------------------------
> > | 3    |  RON             |  English  | <-
> > position()=3
> > --------------------------------------
> > |      |                  |           |
> > --------------------------------------
> > | 4    |  JON             |  German   | <-
> > position()=4
> > --------------------------------------
> > | 5    |  DON             |  German   | <-
> > position()=5
> > --------------------------------------
> > |      |                  |           |
> > --------------------------------------
> > | 6    |  MON             |  Hebrew   |<-
> position()=6
> > --------------------------------------
> > | 7    |  GON             |  Hebrew   |<-
> position()=7
> > --------------------------------------
> > | 10   | TOTAL= 7         |           |
> > --------------------------------------
> > | 11   |                  |           |
> > --------------------------------------
> > | 12   |                  |           |
> > --------------------------------------
> > | 13   |                  |           |
> > -------------------------------------- 
> > | 14   |                  |           |
> > --------------------------------------
> > | 15   |                  |           |
> > --------------------------------------
> > 
> > 
> > I got last sl no.(10-15) ordered by using 
> > 1. break-count(here 2) 
> > 2. Student nodes count(here 7) 
> > 3. total no. of rows (here 15)(fixed)
> > 
> > Actual Problem is to print Sl No.(Here 1 to 9)
> > 
> > Only solution I suppose, is adding 1,2... after
> > 1st,2nd... breaks but for that I require a global
> > variable which I can increment and add after every
> 
> > break.........BUT....in XSL  variables are read
> only!!!!!!!
> > 
> > 
> > can anybody show me a way? 
> > 
> > (Pl. Also Note Final out put is in PDF.Can it be
> > achieved with FO .....with backgroud image or
> Absolute Positioning...
> > 
> > for this problem I also tried ft:assign but failed
> to
> > use it
> > 
> > Has any body used ft:assign? )
> > 
> > 
> > 
> > 
> > tia
> > 
> > Regards,
> > Raj
> > 
> > __________________________________
> > Do you Yahoo!?
> > Yahoo! SiteBuilder - Free, easy-to-use web site
> design 
> > software http://sitebuilder.yahoo.com
> > 
> >  XSL-List info and archive: 
> http://www.mulberrytech.com/xsl/xsl-list
> > 
> 
> 
>  XSL-List info and archive: 
> http://www.mulberrytech.com/xsl/xsl-list
> ve:  http://www.mulberrytech.com/xsl/xsl-list
> 


__________________________________
Do you Yahoo!?
Yahoo! SiteBuilder - Free, easy-to-use web site design software
http://sitebuilder.yahoo.com

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



Current Thread
Keywords