Подсчет 5 самых популярных постов в блоге SharePoint с помощью XSL

Я в основном редактирую ItemStyle.xsl, чтобы получить то, что мне нужно, и отобразить через CQWP (веб-часть запроса контента). Мне нужно, чтобы отображались только 5 лучших постов с наибольшим количеством комментариев. Комментарии можно получить через @NumComments. Я недостаточно знаком с XSL, чтобы знать, как это сделать, я предполагаю, что использую count? Какие-нибудь советы?

Вот текущий код XSL для этого шаблона, который просто отображает все сообщения.

<xsl:template name="MostCommented" match="Row[@Style='MostCommented']" mode="itemstyle">
    <xsl:variable name="SafeLinkUrl">
        <xsl:call-template name="OuterTemplate.GetSafeLink">
            <xsl:with-param name="UrlColumnName" select="'LinkUrl'"/>
        </xsl:call-template>
    </xsl:variable>
    <xsl:variable name="DisplayTitle">
        <xsl:call-template name="OuterTemplate.GetTitle">
            <xsl:with-param name="Title" select="@Title"/>
            <xsl:with-param name="UrlColumnName" select="'LinkUrl'"/>
        </xsl:call-template>
    </xsl:variable>
    <div>
        <a href="{$SafeLinkUrl}" target="{$LinkTarget}" title="{@LinkToolTip}">
            <xsl:value-of select="$DisplayTitle"/>
        </a>
    </div>
</xsl:template>

person zen    schedule 23.12.2011    source источник
comment
Я обновил свой ответ, добавив полный пример кода.   -  person Dimitre Novatchev    schedule 24.12.2011


Ответы (2)


Вам необходимо добавить этот код - в шаблон, который соответствует родительскому элементу Row

<xsl:apply-templates select="Row[@Style='MostCommented']" mode="itemstyle">
 <xsl:sort select="@NumComments" data-type="number" order="descending"/>
</xsl:apply-templates>

Кроме того, внутри вашего шаблона (того, который будет выбран для выполнения в результате xsl:apply-templates выше) оберните весь существующий код в условное выражение, как показано ниже:

<xsl:template name="MostCommented" match="Row[@Style='MostCommented']" mode="itemstyle">
 <xsl:if test="not(position() > 5)">
  <!-- Put all already-existing code here -->
 </xsl:if>
</xsl:template> 

Вот полный пример, иллюстрирующий эту технику:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/*">
     <t>
       <xsl:apply-templates select="*">
        <xsl:sort select="@valued"
            data-type="number" order="descending"/>
       </xsl:apply-templates>
     </t>
 </xsl:template>

 <xsl:template match="post">
  <xsl:if test="not(position() >5)">
   <xsl:copy-of select="."/>
  </xsl:if>
 </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к следующему XML-документу (вы забыли его предоставить !!!):

<t>
 <post valued="5"/>
 <post valued="2"/>
 <post valued="9"/>
 <post valued="8"/>
 <post valued="6"/>
 <post valued="3"/>
 <post valued="4"/>
 <post valued="10"/>
 <post valued="2"/>
 <post valued="7"/>
</t>

Получен желаемый правильный результат:

<t>
   <post valued="10"/>
   <post valued="9"/>
   <post valued="8"/>
   <post valued="7"/>
   <post valued="6"/>
</t>
person Dimitre Novatchev    schedule 23.12.2011
comment
Димитр, я не знаю, где добавить часть шаблонов приложений. Будет ли это в том же документе? - person zen; 27.12.2011
comment
@zen: Где-то в коде, который вы нам не показали, есть инструкция xsl:apply-templates, которая выбирает для выполнения шаблон, который вы указали в своем вопросе. Она может быть написана разными способами, поэтому я не могу сказать вам, как найти эту инструкцию, не видя полного кода и не видя исходного XML-документа. Вам не нужно добавлять новую xsl:apply-templates инструкцию, только измените текущую <xsl:apply-templates select="somePattern" mode="itemstyle"> на <xsl:apply-templates select="somePattern" mode="itemstyle"> <xsl:sort select="something"/><xsl:ap - person Dimitre Novatchev; 27.12.2011
comment
хорошо, спасибо, я поищу. Это SharePoint, поэтому многие вещи недоступны или скрыты и т. Д. - person zen; 27.12.2011
comment
@zen: код XSLT не скрыт. Кроме того, вы можете получить XML-документ простым <xsl:template match="/"><xsl:copy-of select="."/></xsl:template> - person Dimitre Novatchev; 27.12.2011

Мне удалось сделать это прямо в веб-части CQWP вместо ItemStyle.xsl.

Замена

<property name="QueryOverride" type="string" />

С участием

<property name="QueryOverride" type="string"><![CDATA[<OrderBy><FieldRef Name="NumComments" Nullable="True" Type="Lookup" Ascending="False"/></OrderBy>]]></property>
person zen    schedule 03.01.2012