RE: [xsl] Getting the first and last nodes of a sorted nodeset

Subject: RE: [xsl] Getting the first and last nodes of a sorted nodeset
From: "M. David Peterson" <m.david@xxxxxxxxxx>
Date: Wed, 7 Apr 2004 13:08:37 -0600
Whoa, that's a lot of code to accomplish such a straight forward task.
To access the first node in a resulting data set you would simply use
[1] next to your XPath selection criteria.  To add to that the last node
as well then add another criteria next to this one that adds to the mix
the last() function that selects that last element in an RTF.

This template below accesses the first and last elements within the
resulting node set found by selecting the first and last "nd" elements
from the resulting node-set of test/nd.  The fact that further down in
your tree you have an additional test element with nd children is
irrelevant given the fact that this element will never contain the first
or the last element of the resulting nd data set.  Excluding these nodes
in your select statement just makes your life easier.  So this statement
-> select="test/nd[1][last]" will give you just what you need. The
second template is what the apply-templates used in the first template
will match to given that we used "nd" as the match value for the
template.  Just format the output as needed within this template and
your done.


<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
version="1.0">
<xsl:template match="root">
  <xsl:apply-templates select="test/nd[1][last()]"/>
</xsl:template>
<xsl:template match="nd">
  <xsl:value-of select="."/><br/>
</xsl:template>
</xsl:stylesheet>

best of luck!

<M:D/>

-----Original Message-----
From: Hansen, John [mailto:John.Hansen@xxxxxxxxxx] 
Sent: Wednesday, April 07, 2004 11:27 AM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: RE: [xsl] Getting the first and last nodes of a sorted nodeset

Sorry about that probably FAQ.  It turned out to be easy.  Here's the
solution I just came up with if anyone is interested:

<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
version='1.0'>
<xsl:output method='html'/>

<xsl:template match="/root">
<html>
<xsl:for-each select="//nd">
  <xsl:sort select="."/>
<!--    <xsl:value-of select="."/><br/> -->

  <xsl:if test="position()=1">
    <xsl:call-template name="get_first">
      <xsl:with-param name="f"><xsl:value-of
select="."/></xsl:with-param>
    </xsl:call-template>
  </xsl:if>

</xsl:for-each>
</html>
</xsl:template>

<xsl:template name="get_first">
  <xsl:param name="f"></xsl:param>

  <xsl:for-each select="//nd">
    <xsl:sort select="."/>
    <xsl:if test="position()=last()">
      <xsl:call-template name="test_template">
        <xsl:with-param name="b"><xsl:value-of
select="$f"/></xsl:with-param> <!-- first element -->
        <xsl:with-param name="c"><xsl:value-of
select="."/></xsl:with-param> <!-- last element -->
      </xsl:call-template>
    </xsl:if>
  </xsl:for-each>

</xsl:template>

<xsl:template name="test_template">
  <xsl:param name="b"></xsl:param>
  <xsl:param name="c"></xsl:param>
  <xsl:value-of select="$b" /><br/>
  <xsl:value-of select="$c" />
</xsl:template>

</xsl:stylesheet>

Current Thread