выбор лучших элементов X из Xml с помощью XSLT в Umbraco - PullRequest
3 голосов
/ 16 февраля 2011

У меня есть блог на основе Umbraco, и я хочу отобразить 10 лучших постов в каждой категории на первой странице моего блога. Категория - это просто еще одно свойство в моем Типе документа.

Umbraco в основном хранит свое содержимое в формате XML, поэтому категория является элементом моего блога xml.

Я использую Blog4Umbraco в качестве базового пакета блогов на Umbraco, и он хранит записи блогов («документы») в иерархии года / месяца / дня на основе даты. например если бы я создал пост в блоге «Помоги мне с этим» сегодня, он был бы под /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>

1 Ответ

7 голосов
/ 16 февраля 2011

Вместо :

<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>
...