Connecting Tech Pros Worldwide Help | Site Map

'Sort' One XML file into another XML file? (Help required pls!)

Newbie
 
Join Date: Jan 2009
Posts: 1
#1: Jan 22 '09
In need of some good advice on 'consolidating' an XML file into another folks. Hope you can help!

My souce XML looks like so:
Expand|Select|Wrap|Line Numbers
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <vehicles>
  3.     <make xmake="ALFA ROMEO">
  4.         <model xmodel="159 SPORTWAGON">
  5.             <derivative xderivative="3.2 V6 JTS Q4 Lusso 5dr" />
  6.         </model>
  7.     </make>
  8.     <make xmake="ALFA ROMEO">
  9.         <model xmodel="SPIDER CONVERTIBLE">
  10.             <derivative xderivative="3.2 V6 JTS Q4 2dr" />
  11.         </model>
  12.     </make>
  13.     <make xmake="ALFA ROMEO">
  14.         <model xmodel="SPIDER CONVERTIBLE">
  15.             <derivative xderivative="2.8 V6 Q4 2dr" />
  16.         </model>
  17.     </make>
  18.     <make xmake="CITROEN">
  19.         <model xmodel="C4 COUPE SPECIAL EDITIONS">
  20.             <derivative xderivative="1.6HDi 16V by LOEB 3dr" />
  21.         </model>
  22.     </make>
  23.     <make xmake="FORD">
  24.         <model xmodel="S-MAX DIESEL ESTATE">
  25.             <derivative xderivative="2.0 TDCi LX 5dr" />
  26.         </model>
  27.     </make>
  28. </vehicles>
  29.  
Basically I have several vehicles but need to group them by Make, Model and Derivative thus:
Expand|Select|Wrap|Line Numbers
  1. <vehicles>
  2.                 <make name='ALFA ROMEO'>
  3.                                 <model name='159 SPORTWAGON'>
  4.                                 <Derivative>3.2 V6 JTS Q4 Lusso 5dr</Derivative>
  5.                                 </model>
  6.                                 <model name='SPIDER CONVERTIBLE'>
  7.                                                 <Derivative>3.2 V6 JTS Q4 2dr</Derivative>
  8.                                                 <Derivative>2.8 V6 Q4 2dr</Derivative>
  9.                                 </model>
  10.                 </make>
  11.  
  12.                 <make name='CITROEN'>
  13.                                 <model name='C4 COUPE SPECIAL EDITIONS'>
  14.                                                 <Derivative>1.6HDi 16V by LOEB 3dr</Derivative>
  15.                                 </model>
  16.                 </make>
  17.  
  18.                 <make name='FORD'>
  19.                                 <model name='S-MAX DIESEL ESTATE'>
  20.                                                 <Derivative>2.0 TDCi LX 5dr</Derivative>
  21.                                 </model>
  22.                 </make>
  23. </vehicles>
  24.  
I'm pretty new to using XSL so any pointers towards how to acheive this would be gratefully received!

Many thanks!
TM2AM
Moderator
 
Join Date: Mar 2006
Posts: 1,103
#2: Jan 23 '09

re: 'Sort' One XML file into another XML file? (Help required pls!)


It's multi-level Muenchian Grouping:
Jeni's XSLT Pages: Grouping Using the Muenchian Method
Expand|Select|Wrap|Line Numbers
  1. <xsl:key name="vehicle-by-make" match="make" use="@xmake"/>
  2. <xsl:key name="vehicle-by-make-model" match="make" use="concat(@make, '_', model/@xmodel)"/>
  3. ...
  4. ...
  5. <xsl:for-each select="make[count(.|key('vehicle-by-make', @xmake)[1]) = 1]">
  6. <xsl:copy>
  7. ....
  8. <xsl:for-each select="key('vehicle-by-make', @xmake)[count(.|key('vehicle-by-make-model', concat(@make, '_', model/@xmodel)[1]) = 1]">
  9. ...
  10. <xsl:for-each select=key('vehicle-by-make-model', concat(@make, '_', model/@xmodel)">
  11.  
  12.  
It's the 2nd for-each which is the most confusing.
Reply