我有一个基于umbraco的博客,我想在我的博客首页显示每个类别的前10个帖子。类别只是我的文档类型的另一个属性。
umbraco基本上将其内容存储为xml,因此category是我的博客文章xml的一个元素。
我使用blog4umbraco作为umbraco的基本blog包,它以基于日期的年/月/日层次结构存储blog文章(“文档”)。例如,如果我今天创建了一篇博客文章“帮我做这个”,那么它将位于/2011/02/16/帮我做这个。
我有xlst显示所有的帖子。它遍历每个文件夹,然后按日期排序。问题是我只想要每个类别的10篇最新博客文章。以下xslt显示选择特定类别的所有博客文章。考虑到我可能需要跨越多个文件夹(多天、多个月、甚至几年)才能获得10个文件夹,如何将其限制为仅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>
最佳答案
而不是:
<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">
<!-- Some processing here -->
</div>
</xsl:if>
</xsl:for-each>
用途:
<xsl:for-each select=
".//node [@nodeTypeAlias = 'BlogPost']
[data[@alias='topic'] = $topic]
">
<xsl:sort select="ss:dayNumber(@createDate)"
data-type="number" order="descending"/>
<xsl:if test="not(position() > 10)">
<div class="listing">
<!-- Some processing here -->
</div>
</xsl:if>
</xsl:for-each>
关于xml - 在Umbraco中使用XSLT从Xml中选择前X个项目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5011995/