Here's the scenario: We're have an xml set of nodes, returned in the same order as they appear in the umbraco panel. We can obviously use sort (whether we use appy-template or foreach), and order them by date in ASC or DESC order.

The problem begins when we need to link the nodes by adding previous (node, article, blog post...) and next links. Using node::following or node::preceding would not solve the problem as they both point to the structure initially being returned by umbraco - before they get sorted by date.

The following approach isn't perfect, as we end up replicating xml data, and with 100+ nodes would fill up the momeory, however it works pretty well and it may save someone a lot of time.

The plan is to create the vartiable that holds the nodes we need - sorted in the correct order; and simply apply-templates or use foreach to populate the data. What we can do then, is use node::following and node::preceding to get the next/previous links within the context of the variable we created instead of $currentPage.

<!-- 1. save sorted nodes into a variable -->
<xsl:variable name="sortedItems">
  <xsl:for-each select="$currentPage/../node[@nodeTypeAlias = 'XXX']">
     <xsl:sort select="CONDITION" order="descending or ascending" />
        <xsl:copy-of select="." />
   </xsl:for-each>
</xsl:variable>

<!-- 2. call template using sortedItems as a param -->
<xsl:call-template name="displayItems">
   <xsl:with-param name="nodes" select="msxml:node-set($sortedItems)" />
</xsl:call-template>

<!-- 3. get previous/next link -->
<xsl:template name="displayItems">
   
   <xsl:param name="nodes"/>
   <xsl:variable name="currentNode" select="$nodes/node[@id = $currentPage/@id]" />   
   <xsl:variable name="nextItem" select="$currentNode/preceding::node" />
   <xsl:variable name="previousItem" select="$currentNode/following::node" />

   <xsl:if test="string($previousItem)">
      <a href="{umbraco.library:NiceUrl($previousItem/@id)}">previous</a>
    </xsl:if>

   <xsl:if test="string($nextItem)">
      <a href="{umbraco.library:NiceUrl($nextItem/@id)}">next</a>
    </xsl:if>

</xsl:template>

Tagged: template  umbraco  web programming  xsl:following-sibling  xsl:preceding-sibling  xsl:sort  xslt