Subject: Re: [xsl] sorting into a tree structure From: jim mcgovern <jim.mcgovern2@xxxxxxxxxxxxxx> Date: Tue, 6 Oct 2009 16:58:01 +0100 |
Hi Martin Thanks for the quick reply. Both ULs and LIs need to be sorted by the order attribute. For example, the output I'm looking to achieve would be:- <ul> <li>item1</li> <ul> <li>item6</li> <ul> <li> <a href="#">item10</a> </li> <li> <a href="#">item8</a> </li> <li> <a href="#">item7</a> </li> <li> <a href="#">item9</a> </li> </ul> <li>item2</li> <ul> <li> <a href="#">item5</a> </li> <li> <a href="#">item4</a> </li> <li> <a href="#">item3</a> </li> </ul> </ul> </ul> I've tried your suggestion but it didn't seem to affect the order unfortunately. :( Thanks Jim On Tue, Oct 6, 2009 at 4:21 PM, Martin Honnen <Martin.Honnen@xxxxxx> wrote: > jim mcgovern wrote: >> >> Hi All >> >> I'm trying to find the most efficient way of sorting a flat xml file >> into a tree structure. My xslt so far is pretty simple and sorts the >> XML into a HMTL tree structure <ul><li><ul>...etc. But what I'm >> having trouble with is the most efficient way of sorting the content. >> My tree structure needs to be ordered using the order attribute in the >> xml. My xml is:- >> >> <?xml version="1.0" encoding="utf-8" ?> >> <folders> >> <Item ID="1" ParentItem="" order="1" title="item1"/> >> <Item ID="2" ParentItem="1" order="2" title="item2"/> >> <Item ID="3" ParentItem="2" order="3" title="item3"/> >> <Item ID="4" ParentItem="2" order="2" title="item4"/> >> <Item ID="5" ParentItem="2" order="1" title="item5"/> >> <Item ID="6" ParentItem="1" order="1" title="item6"/> >> <Item ID="7" ParentItem="6" order="3" title="item7"/> >> <Item ID="8" ParentItem="6" order="2" title="item8"/> >> <Item ID="9" ParentItem="6" order="4" title="item9"/> >> <Item ID="10" ParentItem="6" order="1" title="item10"/> >> </folders> >> >> And my xslt so far is pretty simple:- >> >> <?xml version="1.0" encoding="UTF-8"?> >> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >> version="1.0"> >> <xsl:output indent="yes"/> >> <xsl:key name="val" match="Item" use="@ParentItem"/> >> <xsl:template match="folders"> >> <ul><xsl:apply-templates select="key('val', '')"/></ul> >> </xsl:template> >> <xsl:template match="Item"> >> <xsl:choose> >> <xsl:when test="key('val', @ID)"> >> <li><xsl:value-of select="@title"/></li> >> <ul><xsl:apply-templates select="key('val', @ID)"/></ul> >> </xsl:when> >> <xsl:otherwise> >> <li><xsl:value-of select="@title"/></li> >> </xsl:otherwise> >> </xsl:choose> >> </xsl:template> >> </xsl:stylesheet> >> >> I'd appreciate any pointers on how to implement an efficient sort >> using the order attribute! > > Do you want to sort the li children of each ul? Then the following change to > your stylesheet should do: > > <xsl:template match="Item"> > <xsl:choose> > <xsl:when test="key('val', @ID)"> > <li><xsl:value-of select="@title"/></li> > <ul> > <xsl:apply-templates select="key('val', @ID)"> > <xsl:sort select="order" data-type="number"/> > </xsl:apply-templates> > </ul> > </xsl:when> > <xsl:otherwise> > <li><xsl:value-of select="@title"/></li> > </xsl:otherwise> > </xsl:choose> > </xsl:template> > > > > -- > > Martin Honnen > http://msmvps.com/blogs/martin_honnen/
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] sorting into a tree struc, Martin Honnen | Thread | Re: [xsl] sorting into a tree struc, Martin Honnen |
Re: [xsl] sorting into a tree struc, Martin Honnen | Date | Re: [xsl] sorting into a tree struc, Martin Honnen |
Month |