|
Subject: RE: [xsl] Sorting on two booleans From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Thu, 26 Feb 2009 18:12:34 -0000 |
Ah sorry, I missed that subtlety. So the first sort key is @active,
descending, and the second is (active = published), false<true:
<xsl:sort select="number(@active = @published)" data-type="number"/>
(or in XSLT 2.0 you can sort booleans directly, with false<true, giving
<xsl:sort select="@active eq @published" />
Alternatively, you can probably do it with a single sort key:
<xsl:for-each select="project">
<xsl:sort select="substring('dcab', 2*@active + @published + 1, 1)"/>
But I haven't tested it and it's a bit obscure for practical use.
Michael Kay
http://www.saxonica.com/
> -----Original Message-----
> From: Joelle Tegwen [mailto:tegwe002@xxxxxxx]
> Sent: 26 February 2009 17:55
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: Re: [xsl] Sorting on two booleans
>
> That gives me
> active, not published
> active, published
> not active, not published
> not active, published
>
> But I need the last two reversed.
> not active, published
> not active, not published
>
> Thanks
> Joelle
>
> Michael Kay wrote:
> >> I've got a document that looks like this:
> >> <projects>
> >> <project active="1" published="1">stuff</project>
> >> <project active="1" published="0">stuff</project>
> >> <project active="0" published="1">stuff</project>
> >> <project active="0" published="0">stuff</project> </projects
> >>
> >> And I need to be able to sort them (on the fly - it's part of a
> >> sortable table in html) in this order and the reverse:
> >> active, not published
> >> active, published
> >> not active, published
> >> not active, not published.
> >>
> >
> > So your major sort key is @active (true<false) and your
> minor sort key
> > is @published (false<true).
> >
> > That's
> >
> > <xsl:for-each select...>
> > <xsl:sort select="@active" data-type="number" order="descending"/>
> > <xsl:sort select="@published" data-type="published"
> > order="ascending"/>
> >
> > For the reverse order, flip all the order="" attributes.
> >
> > Michael Kay
> > http://www.saxonica.com/
> >
> >
> >
> >> I've tried all kinds of ways to sort them to get this to happen
> >> including brute force:
> >> <xsl:for-each select="project">
> >> <xsl:sort select="@active=1 and
> @published=0"
> >> order="ascending"
> >> data-type="number"/>
> >> <xsl:sort select="@active=1 and
> @published=1"
> >> order="ascending"
> >> data-type="number"/>
> >> <xsl:sort select="@active=0 and
> @published=1"
> >> order="ascending"
> >> data-type="number"/>
> >> <xsl:sort select="@active=0 and
> @published=0"
> >> order="ascending"
> >> data-type="number"/>
> >> <xsl:copy-of select="."/>
> >> </xsl:for-each>
> >>
> >>
> >> Nothing works. It always comes out with at least one in the wrong
> >> spot.
> >>
> >> Could someone point me in the right direction? Help me understand
> >> what I'm missing about how sort works?
> >>
> >> Thanks much in advance
> >> Joelle
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] Sorting on two booleans, Joelle Tegwen | Thread | Re: [xsl] Sorting on two booleans, Joelle Tegwen |
| Re: [xsl] Sorting on two booleans, Joelle Tegwen | Date | [xsl] Grouping & use of keys, Dick Penny |
| Month |