[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

[xsl] Sorting complex objects


Subject: [xsl] Sorting complex objects
From: "Mark Wilson" <mark@xxxxxxxxxxxx>
Date: Sun, 8 Mar 2009 01:47:55 -0700

I need to transform a file of random-order complex items into an ordered file. I tried using 'for-each-group' nested, but failed to get the results I wanted

As I said, in the input file, the items are random and an item may occur more than once and have <SomeData> elements with different contents - both <SomeData> elements need to be preserved in the output file. The <Items> are ordered by <Heading>, then sequentially by the three <SubDivX> elements, and finally by <SomeData>. Everything sorts as strings.

I have been thinking about something like:
<xsl:template match="List>
<xsl:for-each-group select="Item" group-by="concat(Heading,SubDiv1,SubDiv2,SubDiv3) " collation="{$sorting-collation}">
<xsl:sort select="current-grouping-key()" collation="{$sorting-collation}"/>
<xsl:for-each select="current-group()">
<xsl:sort select="SomeData" collation="{$sorting-collation}"/>


-----but get lost in here----

</xsl:for-each>
</xsl:for-each-group>
</xsl:template>

Am I close? I am missing some key concept about working with node sets and would appreciate any help.
Oh, each of Heading, and the SubDivX elements have four attributes significant to the sorting. I think I can just substitute something like this
SubDivX,SubDivX/@scott,SubDivX/@scott-number,SubDivX/@pofis,SubDivX/@pofis-number for each SubDivX and the Heading in the final version. Or is there an easier way to say that?


Thanks,
Mark

Output file (ordered and consolidated)
<List>
<Item>
   <Heading>Bonn</Heading>
    <SubDiv1>Avenue</SubDiv1>
  <SubDiv2>Crosswalks</SubDiv2>
   <SubDiv3>Dangerous</SubDiv3>
   <SomeData></SomeData>
</Item>
<Item >
   <Heading>Prague</Heading>
   <SomeData>1</SomeData> <----- Consolidated
   <SomeData>2</SomeData>
   </Item>
<Item>
   <Heading>Prague</Heading>
   <SubDiv1>Avenues</SubDiv1>
   <SomeData></SomeData>
</Item>
<Item>
   <Heading>Prague</Heading>
   <SubDiv1>Avenues</SubDiv1>
   <SubDiv2>Crosswalks</SubDiv2>
<    SomeData></SomeData>
</Item>
<Item>
   <Heading>Prague</Heading>
   <SubDiv1>Avenue</SubDiv1>
   <SubDiv2>Crosswalks</SubDiv2>
   <SubDiv3>Dangerous</SubDiv3>
   <SomeData></SomeData>
</Item>
<Item>
   <Heading>Prague</Heading>
<    SubDiv1>Streets</SubDiv1>
   <SomeData></SomeData>
</Item>
<Item>
   <Heading>Washington></Heading>
   <SomeData></SomeData>
</Item>
</List>


Input file (Random, not consolidated)
<List>
<Item>
<Heading>Prague</Heading>
<SubDiv1>Avenues</SubDiv1>
<SubDiv2>Crosswalks</SubDiv2>
<SomeData>12</SomeData>
</Item>
<Item >
<Heading>Prague</Heading>
<SomeData>1</SomeData> <--- Needs to me consolidated
</Item>
<Item>
<Heading>Prague</Heading>
<SubDiv1>Avenues</SubDiv1>
<SomeData></SomeData>
</Item>
<Item>
<Heading>Prague</Heading>
<SubDiv1>Avenue</SubDiv1>
<SubDiv2>Crosswalks</SubDiv2>
<SubDiv3>Dangerous</SubDiv3>
<SomeData></SomeData>
</Item>
<Item>
<Heading>Bonn</Heading>
<SubDiv1>Avenue</SubDiv1>
<SubDiv2>Crosswalks</SubDiv2>
<SubDiv3>Dangerous</SubDiv3>
<SomeData></SomeData>
</Item>
<Item>
<Heading>Prague</Heading>
<SubDiv1>Streets</SubDiv1>
<SomeData></SomeData>
</Item>
<Item>
<Heading>Washington></Heading>
<SomeData></SomeData>
</Item>
<Item >
<Heading>Prague</Heading>
<SomeData>2</SomeData><--- Needs to me consolidated
</Item>
</List>



Current Thread