RE: [xsl] combining the children of similar nodes under one node

Subject: RE: [xsl] combining the children of similar nodes under one node
From: "Jim Fuller" <jim.fuller@xxxxxxxxxxxxxx>
Date: Sun, 7 Mar 2004 18:04:10 -0000
> -----Original Message-----
> From: owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx 
> [mailto:owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx] On Behalf Of 
> David Montalvo
> Sent: 07 March 2004 00:12
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] combining the children of similar nodes under one node
> 
> 
> in the following example code, notice that all three nodes have the 
> same name. I want to combine all nodes with the same name 
> into one node 
> with all of their <style>s and <types>s, where <style> and <type> are 
> not duplicated.
> 


You could do something like


<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
	<xsl:output method = "xml"/>
	
	<xsl:template match="/">	

  <xsl:variable name="list"
select="/inventory/product/node()[not(.=following::product/node())]" />

 
 	<product>
 		<xsl:copy-of select="$list"/>
	</product>

	</xsl:template>
	
</xsl:stylesheet>

Gl, Jim Fuller

> <inventory>
> 	<product>
> 		<name>chair</name>
> 		<style>rocking</style>
> 	</product>
> 
> 	<product>
> 		<name>chair</name>
> 		<type>rocking</type> --> same value as <style> above
> 	</product>
> 	<product>
> 		<name>chair</name>
> 		<style>folding</style>
> 		<type>lawn</type>
> 	</product>
> </inventory>
> 
> When I'm in the first node, I grab it, when I'm in the second node, I 
> can check the preceding <style> value and skip it, when I'm in the 
> third node I grab it. That gives me:
> 
> 	<product>
> 		<name>chair</name>
> 		<style>rocking</style>
> 	</product>
> 	<product>
> 		<name>chair</name>
> 		<style>folding</style>
> 		<type>lawn</type>
> 	</product>
> 
> I figured out that, while in the second of these nodes, I can 
> check if 
> the preceding name is the same and, if so, get the preceding <style> 
> and add it to the second product node, giving me:
> 
> 	<product>
> 		<name>chair</name>
> 		<style>rocking</style>
> 	</product>
> 	<product>
> 		<name>chair</name>
> 		<style>rocking</style>
> 		<style>folding</style>
> 		<type>lawn</type>
> 	</product>
> 
> but I still have 2 products with the name "chair". how can I get the 
> result:
> 
> 	<product>
> 		<name>chair</name>
> 		<style>rocking</style>
> 		<style>folding</style>
> 		<type>lawn</type>
> 	</product>
> 
> One of the problems is that <style> and <type> are being used 
> interchangeably, but I think I compensated for that. My big 
> problem is 
> getting everything listed under one name with no duplicates.
> 
> -dave
> 
> 
> 
> 
>  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
> 


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


Current Thread