Re: [xsl] Grouping and then more grouping

Subject: Re: [xsl] Grouping and then more grouping
From: Alex Muir <alex.g.muir@xxxxxxxxx>
Date: Tue, 16 Aug 2011 00:09:16 +0000
> I just can't figure out how you expect "Sea" to come before "Air" when "Air"
> comes before "Sea" in your input.  Are you not mentioning an ordering
> requirement?

Sorry my bad on the example of the output which your correct is in the
wrong order.

I've tried running it but it doesn't quite work perhaps because you
didn't have the same volume of input data that I had to test with,
sorry if that is the case.

Meanwhile I've found an ugly solution but got the job done before the
deadline in the morning so good for now but I'd still like to know a
better method if one exists.

Essentially this code solves the problem by adding an extra /group to
this template and rerunning from the last output.  <xsl:template
match="root/group/group/group/group/group/group/group/group">

 <xsl:template match="root">
    <root>

      <xsl:apply-templates/>

    </root>
  </xsl:template>

  <xsl:template match="group">
    <xsl:copy>
      <xsl:copy-of select="@*"/>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="root/group/group/group/group/group/group/group/group">
    <xsl:copy>
      <xsl:copy-of select="@*"/>
      <xsl:call-template name="CopyGroup"/>
      <xsl:apply-templates select="item"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template name="CopyGroup">
    <xsl:for-each-group select="group" group-by="@xml:id">
      <xsl:copy>
        <xsl:copy-of select="@*"/>
        <xsl:copy-of select="current-group()/*"/>
      </xsl:copy>
    </xsl:for-each-group>
  </xsl:template>

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

I changed the input a bit to make it perhaps easier moving name as an
attribute. I'll paste a sample of some more example input.

   <group xml:id="MILHIS_Yes" name="Yes">
      <group xml:id="MILHIS_Vehicles" name="Vehicles">
         <group xml:id="MILHIS_Air" name="Air">
            <group xml:id="MILHIS_Aeroplane" name="Aeroplane">
               <item xml:id="MILHIS_Attack_Aircraft" name="Attack Aircraft"/>
            </group>
         </group>
      </group>
   </group>
   <group xml:id="MILHIS_Yes" name="Yes">
      <group xml:id="MILHIS_Vehicles" name="Vehicles">
         <group xml:id="MILHIS_Air" name="Air">
            <group xml:id="MILHIS_Aeroplane" name="Aeroplane">
               <item xml:id="MILHIS_Bomber_Aircraft" name="Bomber Aircraft"/>
            </group>
         </group>
      </group>
   </group>
   <group xml:id="MILHIS_Yes" name="Yes">
      <group xml:id="MILHIS_Vehicles" name="Vehicles">
         <group xml:id="MILHIS_Air" name="Air">
            <group xml:id="MILHIS_Aeroplane" name="Aeroplane">
               <item xml:id="MILHIS_Jet_Aircraft" name="Jet Aircraft"/>
            </group>
         </group>
      </group>
   </group>
   <group xml:id="MILHIS_Yes" name="Yes">
      <group xml:id="MILHIS_Vehicles" name="Vehicles">
         <group xml:id="MILHIS_Air" name="Air">
            <group xml:id="MILHIS_Aeroplane" name="Aeroplane">
               <item xml:id="MILHIS_Rocket_Aircraft" name="Rocket Aircraft"/>
            </group>
         </group>
      </group>
   </group>
   <group xml:id="MILHIS_Yes" name="Yes">
      <group xml:id="MILHIS_Vehicles" name="Vehicles">
         <group xml:id="MILHIS_Air" name="Air">
            <group xml:id="MILHIS_Aeroplane" name="Aeroplane">
               <item xml:id="MILHIS_TransportCarrier_Aircraft"
name="Transport/Carrier Aircraft"/>
            </group>
         </group>
      </group>
   </group>
   <group xml:id="MILHIS_Yes" name="Yes">
      <group xml:id="MILHIS_Vehicles" name="Vehicles">
         <group xml:id="MILHIS_Air" name="Air">
            <group xml:id="MILHIS_Aeroplane" name="Aeroplane">
               <item xml:id="MILHIS_Unmanned_Drone" name="Unmanned Drone"/>
            </group>
         </group>
      </group>
   </group>
 <group xml:id="MILHIS_Yes" name="Yes">
      <group xml:id="MILHIS_Vehicles" name="Vehicles">
         <group xml:id="MILHIS_Air" name="Air">
            <group xml:id="MILHIS_Aeroplane" name="Aeroplane">
               <group xml:id="MILHIS_Fighter_Aircraft" name="Fighter Aircraft">
                  <item xml:id="MILHIS_Stealth_Fighter" name="Stealth Fighter"/>
               </group>
            </group>
         </group>
      </group>
   </group>
   <group xml:id="MILHIS_Yes" name="Yes">
      <group xml:id="MILHIS_Weapons" name="Weapons">
         <group xml:id="MILHIS_Small_Arms__Personal_Weapons"
                name="Small Arms &amp; Personal Weapons">
            <group xml:id="MILHIS_AntiPersonnel_Weapons"
name="Anti-Personnel Weapons">
               <group xml:id="MILHIS_Fully_Automatic_Weapon"
name="Fully Automatic Weapon">
                  <item xml:id="MILHIS_Multiple_Barrel_Firearm"
name="Multiple Barrel Firearm"/>
               </group>
            </group>
         </group>
      </group>
   </group>
   <group xml:id="MILHIS_Yes" name="Yes">
      <group xml:id="MILHIS_Weapons" name="Weapons">
         <group xml:id="MILHIS_Small_Arms__Personal_Weapons"
                name="Small Arms &amp; Personal Weapons">
            <group xml:id="MILHIS_AntiPersonnel_Weapons"
name="Anti-Personnel Weapons">
               <group xml:id="MILHIS_Fully_Automatic_Weapon"
name="Fully Automatic Weapon">
                  <item xml:id="MILHIS_Submachine_Gun" name="Submachine Gun"/>
               </group>
            </group>
         </group>
      </group>
   </group>
 <group xml:id="MILHIS_No" name="No">
      <group xml:id="MILHIS_Troops" name="Troops">
         <group xml:id="MILHIS_Infantry" name="Infantry">
            <item xml:id="MILHIS_Maori_Warrior" name="Maori Warrior"/>
         </group>
      </group>
   </group>
   <group xml:id="MILHIS_No" name="No">
      <group xml:id="MILHIS_Troops" name="Troops">
         <group xml:id="MILHIS_Infantry" name="Infantry">
            <item xml:id="MILHIS_Medieval_Footsoldier" name="Medieval
Footsoldier"/>
         </group>
      </group>
   </group>

Example output from all the input data.. again a sample only partially
reflecting the sample content above but what I'm getting for a final
output in general. I hope I'm being clear but it's late..

   <group xml:id="MILHIS_Yes" name="Yes">
      <group xml:id="MILHIS_Vehicles" name="Vehicles">
         <group xml:id="MILHIS_Air" name="Air">
            <group xml:id="MILHIS_Aeroplane" name="Aeroplane">
               <group xml:id="MILHIS_Fighter_Aircraft" name="Fighter Aircraft">
                  <item xml:id="MILHIS_Stealth_Fighter" name="Stealth Fighter"/>
               </group>
               <item xml:id="MILHIS_Attack_Aircraft" name="Attack Aircraft"/>
               <item xml:id="MILHIS_Bomber_Aircraft" name="Bomber Aircraft"/>
               <item xml:id="MILHIS_Jet_Aircraft" name="Jet Aircraft"/>


The output the I've got from running your script starts like this.
Jeep shouldn't be under Air Vehicles so items are being misplaced.

<group xml:id="MILHIS_Yes">
   <group xml:id="MILHIS_Vehicles">
      <group xml:id="MILHIS_Air">
         <item xml:id="MILHIS_Armoured_Vehicle" name="Armoured Vehicle"/>
         <item xml:id="MILHIS_Chariot" name="Chariot"/>
         <item xml:id="MILHIS_Jeep" name="Jeep"/>



Thanks
Alex

Current Thread