3

Umbracoベースのブログを持っていますが、ブログのフロントページに各カテゴリの上位10件の投稿を表示したいと思います。カテゴリは、私のドキュメントタイプのもう1つのプロパティです。

Umbracoは基本的にそのコンテンツをXMLとして保存するため、categoryは私のブログ投稿xmlの要素です。

私はBlog4UmbracoをUmbracoのベースブログパッケージとして使用しており、ブログ投稿(「ドキュメント」)を年/月/日の日付ベースの階層で保存しています。たとえば、今日「Help me with this」というブログ投稿を作成した場合、それは/ 2011/02/16/help-me-with-thisの下になります。

すべての投稿を表示する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']) &gt; 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>
4

1 に答える 1

7

の代わりに:

<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>
于 2011-02-16T02:58:25.407 に答える