Go Back   Velocity Reviews > Newsgroups > XML
User Name
Password
Register FAQ Members List Calendar Search Today's Posts Mark Forums Read

Reply

XML - XSLT: Select nodes in reverse order

 
Thread Tools Search this Thread
Old 05-14-2006, 12:59 AM   #1
Default XSLT: Select nodes in reverse order


I have an xml document such as:
<device>
<element>first</element>
<element>second</element>
</device>

I am using this as the source for an xslt transform that goes like

<xsl:for-each select="/device/element>
This is the <xsl:value-of select="."/> element.
</xsl:for-each>

This would result in the following:

This is the first element
This is the second element

Is it possible to select the nodes in reverse order so that I would end up
with:

This is the second element
This is the first element

I can add a unique attribute to <element> if that would help such as:
<device>
<element id="1">first</element>
<element id="2">second</element>
</device>

Is there an XPath statement I can use in the <xsl:for-each> to select the
elements in reverse order using the attribute as an order tag?

Scott




thrill5
  Reply With Quote
Old 05-14-2006, 02:54 AM   #2
Jeff Higgins
 
Posts: n/a
Default Re: Select nodes in reverse order


thrill5 wrote:
>I have an xml document such as:
> <device>
> <element>first</element>
> <element>second</element>
> </device>
>
> I am using this as the source for an xslt transform that goes like
>
> <xsl:for-each select="/device/element>
> This is the <xsl:value-of select="."/> element.
> </xsl:for-each>
>
> This would result in the following:
>
> This is the first element
> This is the second element
>
> Is it possible to select the nodes in reverse order so that I would end up
> with:
>
> This is the second element
> This is the first element
>
> I can add a unique attribute to <element> if that would help such as:
> <device>
> <element id="1">first</element>
> <element id="2">second</element>
> </device>
>
> Is there an XPath statement I can use in the <xsl:for-each> to select the
> elements in reverse order using the attribute as an order tag?
>
> Scott
>


Scott,
I'm real new at this so take it with a grain of salt.

<xsl:template match="//device">
<xsl:for-each select="element">
<xsl:sort select="@id" data-type="number" order="descending"/>
<xsl:text>This is the </xsl:text>
<xsl:value-of select="."/>
<xsl:text> element.</xsl:text>
</xsl:for-each>
</xsl:template>


  Reply With Quote
Old 05-14-2006, 03:54 AM   #3
Joe Kesselman
 
Posts: n/a
Default Re: Select nodes in reverse order

Jeff Higgins wrote:
> I'm real new at this so take it with a grain of salt.


You were on the right track...

The nodes selected by xsl:for-each are normally presented in document
order. To get reverse document order, you want to reverse that
positioning -- which can be done by re-sorting in descending order by
original position.

<xsl:template match="/">
<xsl:for-each select="/device/element">
<xsl:sort select="position()" data-type="number" order="descending"/>
This is the <xsl:value-of select="."/> element.
</xsl:for-each>
</xsl:template>

--
() ASCII Ribbon Campaign | Joe Kesselman
/\ Stamp out HTML e-mail! | System architexture and kinetic poetry
  Reply With Quote
Old 05-14-2006, 01:10 PM   #4
Jeff Higgins
 
Posts: n/a
Default Re: Select nodes in reverse order


Joe Kesselman wrote:

> ... To get reverse document order, you want to reverse that positioning --
> which can be done by re-sorting in descending order by original position.
>
> <xsl:sort select="position()" data-type="number" order="descending"/>
>


How neat!
Thanks, Joe.


  Reply With Quote
Reply


Thread Tools Search this Thread
Search this Thread:

Advanced Search

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump