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

Re: [xsl] Grouping adjacent elements by value - within a range


Subject: Re: [xsl] Grouping adjacent elements by value - within a range
From: Michael Kay <mike@xxxxxxxxxxxx>
Date: Fri, 13 Aug 2010 12:52:41 +0100

It's not clear to me whether a period goes in the same group as the previous element if (a) its price is within #20 of the price of the previous period, or (b) its price is within #20 of the price of the first period in the group, or (c) its price is within #20 of every other period within the group. Assuming (c) which seems the most plausible, I think you need to do this by sibling recursion rather than by xsl:for-each-group. Here's an example of the idea, there are plenty of others you can find by googling:

http://internal.rhaptos.org/devblog/cbearden/2009.07.12-2010

The difference is how to test whether the next item belongs in the same group: typically you'll pass along parameters containing the minimum and maximum price of items in the group, and either add the next item to the group or start a new group depending how the price of the next item compares with these two values.

Michael Kay
Saxonica



On 13/08/2010 10:35, Kevin Bird wrote:
Hello

I typeset price tables for Tour Operators brochures. Due to design changes, the space left to display price information has been reduced. I need to group adjacent<price> elements that are within a certain range (the range would be passed as a parameter). Once the price groupings are worked out, I then need to modify the corresponding<period> elements.

The example below shows adjacent price elements grouped that are within a range of #20 (with the lowest price returned). Using the same groupings, the<period> elements are modified by taking the first<startdate> and last<enddate>.

I can use XSLT 2.0.


========================= SOURCE XML =========================

<?xml version="1.0" encoding="UTF-8"?>
<grid>
	<row id="periods">
		<period>
			<startdate>01-Sep-2010</startdate>
			<enddate>19-Sep-2010</enddate>
		</period>
		<period>
			<startdate>20-Sep-2010</startdate>
			<enddate>25-Sep-2010</enddate>
		</period>
		<period>
			<startdate>26-Sep-2010</startdate>
			<enddate>30-Sep-2010</enddate>
		</period>
		<period>
			<startdate>01-Oct-2010</startdate>
			<enddate>11-Oct-2010</enddate>
		</period>
		<period>
			<startdate>12-Oct-2010</startdate>
			<enddate>31-Oct-2010</enddate>
		</period>
	</row>
	<row id="prices">
		<price>1209</price>
		<price>1109</price>
		<price>1129</price>
		<price>1359</price>
		<price>1369</price>		
	</row>
</grid>


========================= RESULT XML =========================

<?xml version="1.0" encoding="UTF-8"?>
<grid>
	<row id="periods">
		<period>
			<startdate>01-Sep-2010</startdate>
			<enddate>19-Sep-2010</enddate>
		</period>
		<period>
			<startdate>20-Sep-2010</startdate>
			<enddate>30-Sep-2010</enddate>
		</period>
		<period>
			<startdate>01-Oct-2010</startdate>
			<enddate>31-Oct-2010</enddate>
		</period>
	</row>
	<row id="prices">
		<price>1209</price>
		<price>1109</price>
		<price>1359</price>
	</row>
</grid>


Any help greatly appreciated.


--
Kevin


Current Thread
Keywords