2

我有一个供个人使用的 Umbraco 网站,我也想将其用作博客。

我试图将 XSLT 放在一起以从博客树中的节点(节点 id = 1063)中获取前三个帖子,并将它们显示在合并到首页的标签页上。

下图说明了节点层次结构:

Umbraco 站点节点

由于我对 XSLT 的了解极其有限,我无法获取“博客”ID 的节点 ID 并在其下方的 3 页显示在我网站的“热门帖子”部分,该部分位于“首页选项卡”下“节点。我发现的所有示例都适用于“当前页面”,它通常是顶级节点“个人网站”。

我应该如何做到这一点?

编辑

已发布页面上呈现的输出实际上是空白的(即使在重新发布整个站点之后),但在后台富文本编辑器中显示的“热门帖子”选项卡内容的预览显示正确。

我正在使用的 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 后,我将再次更新这篇文章(如果有帮助的话)。问题不在于实际数据,因为它是已发布页面和后端之间的断开连接。

4

1 回答 1

1

我没有对此进行测试(我没有你的数据),但使用 position() 方法在一定数量的迭代后停止处理(这里有一些很好的 xslt 示例)。

<xsl:variable name="blogRoot" select="1063"/>
<xsl:for-each select="umbraco.library:GetXmlNodeById($blogRoot)/umbBlogPost [@isDoc]">
  <xsl:if test="position() &lt;= 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>
  }
}
于 2012-09-25T10:29:52.577 回答