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

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • TooMuch2AM
    New Member
    • Jan 2009
    • 1

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

    In need of some good advice on 'consolidating' an XML file into another folks. Hope you can help!

    My souce XML looks like so:
    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <vehicles>
        <make xmake="ALFA ROMEO">
            <model xmodel="159 SPORTWAGON">
                <derivative xderivative="3.2 V6 JTS Q4 Lusso 5dr" />
            </model>
        </make>
        <make xmake="ALFA ROMEO">
            <model xmodel="SPIDER CONVERTIBLE">
                <derivative xderivative="3.2 V6 JTS Q4 2dr" />
            </model>
        </make>
        <make xmake="ALFA ROMEO">
            <model xmodel="SPIDER CONVERTIBLE">
                <derivative xderivative="2.8 V6 Q4 2dr" />
            </model>
        </make>
        <make xmake="CITROEN">
            <model xmodel="C4 COUPE SPECIAL EDITIONS">
                <derivative xderivative="1.6HDi 16V by LOEB 3dr" />
            </model>
        </make>
        <make xmake="FORD">
            <model xmodel="S-MAX DIESEL ESTATE">
                <derivative xderivative="2.0 TDCi LX 5dr" />
            </model>
        </make>
    </vehicles>
    Basically I have several vehicles but need to group them by Make, Model and Derivative thus:
    Code:
    <vehicles>
                    <make name='ALFA ROMEO'>
                                    <model name='159 SPORTWAGON'>
                                    <Derivative>3.2 V6 JTS Q4 Lusso 5dr</Derivative>
                                    </model>
                                    <model name='SPIDER CONVERTIBLE'>
                                                    <Derivative>3.2 V6 JTS Q4 2dr</Derivative>
                                                    <Derivative>2.8 V6 Q4 2dr</Derivative>
                                    </model>
                    </make>
                   
                    <make name='CITROEN'>
                                    <model name='C4 COUPE SPECIAL EDITIONS'>
                                                    <Derivative>1.6HDi 16V by LOEB 3dr</Derivative>
                                    </model>
                    </make>
                   
                    <make name='FORD'>
                                    <model name='S-MAX DIESEL ESTATE'>
                                                    <Derivative>2.0 TDCi LX 5dr</Derivative>
                                    </model>
                    </make>
    </vehicles>
    I'm pretty new to using XSL so any pointers towards how to acheive this would be gratefully received!

    Many thanks!
    TM2AM
  • jkmyoung
    Recognized Expert Top Contributor
    • Mar 2006
    • 2057

    #2
    It's multi-level Muenchian Grouping:
    Jeni's XSLT Pages: Grouping Using the Muenchian Method
    Code:
    <xsl:key name="vehicle-by-make" match="make" use="@xmake"/>
    <xsl:key name="vehicle-by-make-model" match="make" use="concat(@make, '_', [EMAIL="model/@xmodel"]model/@xmodel[/EMAIL])"/>
    ...
    ...
    <xsl:for-each select="make[count(.|key('vehicle-by-make', @xmake)[1]) = 1]">
    <xsl:copy>
    ....
    <xsl:for-each select="key('vehicle-by-make', @xmake)[count(.|key('vehicle-by-make-model', concat(@make, '_', [EMAIL="model/@xmodel)"]model/@xmodel)[/EMAIL][1]) = 1]">
    ...
    <xsl:for-each select=key('vehicle-by-make-model', concat(@make, '_', [EMAIL="model/@xmodel)[1"]model/@xmodel)[/EMAIL]">
    It's the 2nd for-each which is the most confusing.

    Comment

    Working...