Re: [xsl] Searching in Sub-children from an Array

Subject: Re: [xsl] Searching in Sub-children from an Array
From: Ronan Klyne <ronan.klyne@xxxxxxxxxxx>
Date: Wed, 14 Feb 2007 16:58:44 +0000
Houman Khorasani wrote:
> Hello Everyone,
> 
> A while ago I have asked about the lovely Muenchian method to solve a
> simple example.  Unfortunately I am stuck with something that should be
> straight forward.  I greatly would appreciate any input on this:
> 
> 
> XML Input:
> 
> <tree>
> 	<fruit ID="111">
> 		<mango ID="333">
> 			<colour>
> 				<Rate_Structure_Event
> ConceptType="Rate_Structure_Event" ID="1"></Rate_Structure_Event>
> 			</colour>
> 		</mango>
> 		<orange ID="222">
> 			<color>orange</color>
> 		</orange>
> 	</fruit>
> 	<fruit_adjustment>
> 		<color>
> 			<Path>
> 				<Steps>111,333</Steps>			
> 			</Path>
> 			<bla>false</bla>
> 			<Rate_Event ConceptType="Rate_Event"
> ID="A"></Rate_Event>
> 			<Rate_Event ConceptType="Rate_Event"
> ID="B"></Rate_Event>
> 		</color>		
> 	</fruit_adjustment>
> </tree>
> 
> 
> 
> XSLT 2.0:
> 
> <?xml version="1.0" encoding="UTF-8"?>
> <xsl:stylesheet version="2.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
> 	
> 	<xsl:key name="step" match="fruit_adjustment/color//Rate_Event"
> use="../Path/Steps"/>
> 	
> 	<xsl:template match="*">
> 		<xsl:copy>
> 			<xsl:copy-of select="@*"/>
> 			<xsl:apply-templates/>
> 		</xsl:copy>
> 	</xsl:template>
> 	
> 	<xsl:template match="fruit_adjustment"/>
> 	
> 	<xsl:template match="colour">
> 		<xsl:copy-of
> select="(key('step',string-join(ancestor-or-self::*[@ID]/@ID,',')),.)[1]
> "/>
> 	</xsl:template>
> </xsl:stylesheet>
> 
> 
> 
> My desired XML output:
> 
> <tree>
> 	<fruit ID="111">
> 		<mango ID="333">
> 			<Rate_Event ConceptType="Rate_Event"
> ID="A"></Rate_Event>
> 			<Rate_Event ConceptType="Rate_Event"
> ID="B"></Rate_Event>
> 		</mango>
> 		<orange ID="222">
> 			<color>orange</color>
> 		</orange>
> 	</fruit>
> </tree>
> 
> 
> 
> However I get this XML Output, what do I do wrong? (Only one Rate_Event
> is being copied over, why?)
> 
> <tree>
> 	<fruit ID="111">
> 		<mango ID="333">
> 			<Rate_Event ConceptType="Rate_Event" ID="A"/>
> 		</mango>
> 		<orange ID="222">
> 			<color>orange</color>
> 		</orange>
> 	</fruit>
> </tree>
> 
> I greatly appreciate your help,
> Kind Regards
> Houman
> 
> 

I believe the problem is in this line:
<xsl:copy-of
select="(key('step',string-join(ancestor-or-self::*[@ID]/@ID,',')),.)[1]"/>

The section reading
'(key('step',string-join(ancestor-or-self::*[@ID]/@ID,',')),.)' will
select all matching Rate_Event nodes correctly, as well as the current
node. The predicate at the end '[1]', will then take the first item in
this list. I suspect you want to use some kind of conditional here...

	# r

-- 
Ronan Klyne
Business Collaborator Developer
Tel: +44 (0)870 163 2555
ronan.klyne@xxxxxxxxxxx
www.groupbc.com

Current Thread