RE: [xsl] Grouping over multiple files

Subject: RE: [xsl] Grouping over multiple files
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Sat, 14 Jan 2006 15:19:14 -0000
Try replacing

<xsl:copy-of select="."/>

with

<revenue source="{document-uri(/)}">
  <xsl:value-of select="."/>
</revenue>

though document-uri will give you an absolute URI and you may want to cut it
down.

Michael Kay
http://www.saxonica.com/ 

> -----Original Message-----
> From: Kevin Bird [mailto:kevin.bird@xxxxxxxxxxxxxxxxxxxxxxx] 
> Sent: 14 January 2006 14:24
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] Grouping over multiple files
> 
> Hello
> 
> I am grouping <person> elements from four files (North, 
> South, East & West).
> The grouping is working fine, but I would like to add a 
> source attribute to
> the revenue elements to show which file they came from 
> (please see 'desired
> output' section below.
> 
> I have attached cut down versions of the input, along with the current
> stylesheet and output.
> 
> Thanks.
> 
> --
> Kevin
> 
> ------------
> North.xml
> ------------
> 
> <sales>
> 	<period id="October">
> 		<person>
> 			<name>Peter</name>
> 			<revenue>1000</revenue>
> 		</person>
> 		<person>
> 			<name>Fred</name>
> 			<revenue>2000</revenue>
> 		</person>
> 		<person>
> 			<name>Alex</name>
> 			<revenue>100</revenue>
> 		</person>
> 		<person>
> 			<name>Barney</name>
> 			<revenue>20</revenue>
> 		</person>
> 	</period>
> </sales>
> 
> ------------
> South.xml
> ------------
> <sales>
> 	<period id="October">
> 		<person>
> 			<name>Peter</name>
> 			<revenue>500</revenue>
> 		</person>
> 		<person>
> 			<name>Barney</name>
> 			<revenue>750</revenue>
> 		</person>
> 	</period>
> </sales>
> 
> ------------
> East.xml
> ------------
> <sales>
> 	<period id="October">
> 		<person>
> 			<name>Peter</name>
> 			<revenue>40</revenue>
> 		</person>
> 		<person>
> 			<name>Fred</name>
> 			<revenue>5000</revenue>
> 		</person>
> 		<person>
> 			<name>Alex</name>
> 			<revenue>100</revenue>
> 		</person>
> 	</period>
> </sales>
> 
> ------------
> West.xml
> ------------
> <sales>
> 	<period id="October">
> 		<person>
> 			<name>Fred</name>
> 			<revenue>400</revenue>
> 		</person>
> 		<person>
> 			<name>Alex</name>
> 			<revenue>2000</revenue>
> 		</person>
> 	</period>
> </sales>
> 
> ------------
> Sales.xsl
> ------------
> <xsl:stylesheet version="2.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
> 	<xsl:output indent="yes" method="xml"/>
> 
> 	<xsl:variable name="northsales"
> select="document('north.xml')/sales/period/person"/>
> 	<xsl:variable name="southsales"
> select="document('south.xml')/sales/period/person"/>
> 	<xsl:variable name="eastsales"
> select="document('east.xml')/sales/period/person"/>
> 	<xsl:variable name="westsales"
> select="document('west.xml')/sales/period/person"/>
> 
> 	<xsl:template match="/">
> 		<combinedsales>
> 			<xsl:for-each-group select="$northsales,
> $southsales, $eastsales, $westsales" group-by="name">
> 				<person>
> 					<xsl:copy-of
> select="(current-group()/name)[1]"/>
> 					<xsl:for-each
> select="current-group()/revenue">
> 						<xsl:copy-of 
> select="."/>
> 					</xsl:for-each>
> 				</person>
> 			</xsl:for-each-group>
> 		</combinedsales>
> 	</xsl:template>
> </xsl:stylesheet>
> 
> ------------
> Current Output
> ------------
> <combinedsales>
>   <person>
>     <name>Peter</name>
>     <revenue>1000</revenue>
>     <revenue>500</revenue>
>     <revenue>40</revenue>
>   </person>
>   <person>
>     <name>Fred</name>
>     <revenue>2000</revenue>
>     <revenue>5000</revenue>
>     <revenue>400</revenue>
>   </person>
>   <person>
>     <name>Alex</name>
>     <revenue>100</revenue>
>     <revenue>100</revenue>
>     <revenue>2000</revenue>
>   </person>
>   <person>
>     <name>Barney</name>
>     <revenue>20</revenue>
>     <revenue>750</revenue>
>   </person>
> </combinedsales>
> 
> ------------
> Desired Output
> ------------
> <combinedsales>
>   <person>
>     <name>Peter</name>
>     <revenue source="north.xml">1000</revenue>       <!-- add 
> @source to
> indicate file origin -->
>     <revenue source="south.xml">500</revenue>
>     <revenue source="east.xml">40</revenue>
>   </person>
>   <person>
>     <name>Fred</name>
>     <revenue source="north.xml">2000</revenue>
>     <revenue source="east.xml">5000</revenue>
>     <revenue source="west.xml">400</revenue>
>   </person>
>   <person>
>     <name>Alex</name>
>     <revenue source="north.xml">100</revenue>
>     <revenue source="east.xml">100</revenue>
>     <revenue source="west.xml">2000</revenue>
>   </person>
>   <person>
>     <name>Barney</name>
>     <revenue source="north.xml">20</revenue>
>     <revenue source="south.xml">750</revenue>
>   </person>
> </combinedsales>

Current Thread