如何编写Umbraco XSLT来从不相关的树中检索节点

时间:2012-09-24 21:41:08

标签: xslt umbraco

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

我正在尝试将XSLT放在一起以从博客树中的节点(节点ID = 1063)中获取前三个帖子,并在包含在首页的标签页上显示这些帖子。

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

Umbraco site nodes

由于我对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,我将再次更新此帖子(如果这有用)。问题是实际数据较少,因为它是已发布页面和后端之间的脱节。

1 个答案:

答案 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() &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>
  }
}