[XSL-LIST Mailing List Archive Home]
[By Thread]
[By Date]
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----
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?
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>
[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 |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Inlining blocks in FO, Mark Wilson | Thread | Re: [xsl] Sorting complex objects, G. Ken Holman |
Re: [xsl] [Announce-Correction] Han, G. Ken Holman | Date | Re: [xsl] Sorting complex objects, G. Ken Holman |
Month |