I have a blog based on Umbraco, and I want to display the top 10 entries in each category on the first page of my blog. Category is another property of my document.
Umbraco basically saves its content as XML, so the category is an element of my xml blog post.
I use Blog4Umbraco as the base blog package on Umbraco, and it stores blog posts (“documents”) in a hierarchy based on date, year / month / day. for example, if I created a blog post “Help me with this” today, it would be under / 2011/02/16 / help-me-with-this.
I have xlst to display all posts. It iterates through each folder and then sorts by date. The problem is that I want only the 10 most recent blog posts for each category. The following xslt displays all blog entries for a specific category. How to limit it to only 10, given that I may have to cover several folders (several days, months, or even years) to get 10?
<msxsl:script implements-prefix='ss' language='CSharp'>
<![CDATA[
public string monthName(int monthNum)
{
DateTime date = new DateTime(1,monthNum,1);
return date.ToString("MMMM");
}
public int dayNumber(string date)
{
DateTime mydate = DateTime.Parse(date);
return mydate.Day;
}]]>
</msxsl:script>
<xsl:output method="html" omit-xml-declaration="yes"/>
<xsl:param name="currentPage"/>
<xsl:param name="topic" select="/macro/category"/>
<xsl:template match="/">
<div id="archive">
<h3><xsl:value-of select="$topic" /></h3>
<xsl:for-each select="$currentPage/ancestor-or-self::node [@nodeTypeAlias = 'Blog']/node [@nodeTypeAlias = 'DateFolder']">
<xsl:sort select="number(@nodeName)" data-type="number" order="descending"/>
<xsl:for-each select="./node [@nodeTypeAlias = 'DateFolder']">
<xsl:sort select="number(@nodeName)" data-type="number" order="descending"/>
<xsl:for-each select=".//node [@nodeTypeAlias = 'BlogPost']">
<xsl:sort select="ss:dayNumber(@createDate)" data-type="number" order="descending"/>
<xsl:if test="./data[@alias='topic'] = $topic">
<div class="listing">
<a href="{umbraco.library:NiceUrl(@id)}"><xsl:value-of select="@nodeName"/></a> <br/>
<small>
Posted: <xsl:value-of select="umbraco.library:LongDate(@createDate)"/>
By: <xsl:value-of select="@writerName"/><br />
</small>
<xsl:if test="string-length(./data [@alias = 'blogSummary']) = 0">
<xsl:value-of select="substring(umbraco.library:StripHtml(./data [@alias = 'bodyText']), 1, 200)"/>...
</xsl:if>
<xsl:if test="string-length(./data [@alias = 'blogSummary']) > 0">
<xsl:value-of select="./data [@alias = 'blogSummary']"/>
</xsl:if>
</div>
</xsl:if>
</xsl:for-each>
</xsl:for-each>
</xsl:for-each>
</div>
</xsl:template>
source
share