我有一个供个人使用的Umbraco网站,我也希望将其用作博客。
我正在尝试将XSLT放在一起以从博客树中的节点(节点ID = 1063)中获取前三个帖子,并在包含在首页的标签页上显示这些帖子。
下图说明了节点层次结构:
由于我对XSLT的了解非常有限,我无法获取“博客”ID的节点ID,并在下面的3页面显示在我的网站的“热门帖子”部分中,该部分位于“Frontpage Tabs”节点。我找到的所有示例都使用“当前页面”,它通常是顶级节点“个人网站”。
我该如何做到这一点?
修改
渲染的输出在发布的页面上实际上是空白的(即使在重新发布整个站点之后),但是“Top Posts”选项卡内容的后台富文本编辑器中显示的预览也会正确显示。
我使用的XSLT看起来像这样:
<xsl:template match="/">
<ul>
<xsl:for-each select="umbraco.library:GetXmlNodeById(1063)/umbBlogPost [@isDoc]">
<li><a href="{umbraco.library:NiceUrl(@id)}"><xsl:value-of select="@nodeName"/></a></li>
</xsl:for-each>
</ul>
</xsl:template>
选项卡的富文本编辑器中显示的HTML如下所示:
<div umb_macroalias="Dn.BlogListTopThreePosts" ismacro="true" onresizestart="return false;" umbversionid="cb1efb8d-f58c-424b-9c12-df14ac5652d9" umbpageid="1115" title="This is rendered content from macro" class="umbMacroHolder"><!-- startUmbMacro -->
<ul>
<li><a href="/blog/test-post.aspx">Test Post</a></li>
</ul>
<!-- endUmbMacro --></div>
一旦我从数据库中检索XML,我将再次更新此帖子(如果这有用)。问题是实际数据较少,因为它是已发布页面和后端之间的脱节。
答案 0 :(得分:1)
我没有测试过这个(我没有你的数据),但是在经过一定数量的迭代(some good xslt examples here)之后使用position()方法来停止处理。
<xsl:variable name="blogRoot" select="1063"/>
<xsl:for-each select="umbraco.library:GetXmlNodeById($blogRoot)/umbBlogPost [@isDoc]">
<xsl:if test="position() <= 3">
<li><a href="{umbraco.library:NiceUrl(@id)}"><xsl:value-of select="@nodeName"/></a>
</li>
</xsl:if>
</xsl:for-each>
如果您使用剃须刀,您可以执行以下操作:
@using uComponents.Core;
@using uComponents.Core.uQueryExtensions;
@{
var topThreeBlogPosts = @uQuery.GetNodesByType(<blog post doc type>).Take(3);
foreach(blogItem in topThreeBlogPosts)
{
<li><a href="@blogItem.NiceUrl">@blogItem.nodeName</a></li>
}
}