Re: Counting or Modulus calculations in XSL

Subject: Re: Counting or Modulus calculations in XSL
From: Joe English <jenglish@xxxxxxxxxxxxx>
Date: Fri, 30 Jun 2000 13:59:10 -0700
ath@xxxxxx wrote:
> Then I have to parse it with XSL into a two column table so that <info> wit
> odd-number position goes into the left column and the even number <info>
> into the right column, two <info>'s in each row.
> All suggestions welcome. I can only make it appear in one column, one <info
> in each row.  Wouldn't be so tricky if the number of <info> didn't change.

Warren Hedley <w.hedley@xxxxxxxxxxxxxx> replied:
> The very first question in the FAQ! Come on, put some effort in.

That approach would work to build a table with a
fixed number of *rows* and the number of *columns*
depending on the number of items; to do it the other
way around (fixed number of columns, variable number
of rows), you can use call-template recursively:

    template make-row:
	parameter cells = count(child::ITEM);	-- total #cells --
    	parameter cols  = 2;			-- desired #columns --
	parameter start = 1;			-- first cell in this row --
	parameter end   = $start + $cols;	-- last cell in this row --
	element "TR":
	    for-each child::ITEM[position() >= $start and position() < $end ]:
	    	element "TD":
		end element;
	    end for-each;
	end element;
	if $end <= $cells:
	    call-template make-row
		with-parameters start = $end, cols = $cols;
	end if;
    end template.

(Pardon the pseudosyntax; please add punctuation as needed
to make this valid XSL).

Another approach, if you're using SAXON, is to use saxon:group
with group-by="floor((position() - 1) div $cols)".

--Joe English


 XSL-List info and archive:

Current Thread