468,134 Members | 1,281 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 468,134 developers. It's quick & easy.

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
May 14 '06 #1
3 3294

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>
May 14 '06 #2
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
May 14 '06 #3

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.
May 14 '06 #4

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

reply views Thread by Sergio del Amo | last post: by
5 posts views Thread by inquirydog | last post: by
2 posts views Thread by Jon Martin Solaas | last post: by
3 posts views Thread by Ian Roddis | last post: by
8 posts views Thread by Vikram Vamshi | last post: by
27 posts views Thread by didacticone | last post: by
1 post views Thread by gcdp | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.