Попытка получить первый элемент после сортировки XSLT в Sitecore - PullRequest
2 голосов
/ 24 ноября 2011

У меня есть XML, который выглядит следующим образом

<xml>
<news>
    <newsitem>
        <publishdate>2011-10-11</publishdate>
        <title>Article 1</title>
        <breakingnewsflag>false</breakingnewsflag>
    </newsitem>
    <newsitem>
        <publishdate>2009-10-14</publishdate>
        <title>Article 2</title>
        <breakingnewsflag>true</breakingnewsflag>
    </newsitem>
    <newsitem>
        <publishdate>2009-10-12</publishdate>
        <title>Article 3</title>
        <breakingnewsflag>true</breakingnewsflag>
    </newsitem>
</news>
</xml>

Теперь я хочу получить самый последний элемент по дате, для которого флаг breaknews установлен в true.

Кажется,Я могу фильтровать флаг, когда делаю для каждого

<xsl:for-each select="sc:item('/sitecore/content/Home',.)/item[sc:fld('BreakingNewsStory',.)]">

, и я могу сортировать внутри этой коллекции

<xsl:sort select="sc:fld('PublishDate',.)" order="ascending" />

, что оставляет меня с XSLT, который выглядит следующим образом ...

<xsl:for-each select="sc:item('/sitecore/content/Home',.)/item[sc:fld('BreakingNewsStory',.)]">
<xsl:sort select="sc:fld('PublishDate',.)" order="ascending" />

Article Name: <xsl:value-of select="@name" /><br />
Title: <sc:text field="title"/> <br />

</xsl:for-each>

... но я не могу получить первый элемент.

Первый элемент можно получить после проверки флага, используя этот синтаксис

<xsl:for-each select="sc:item('/sitecore/content/Home',.)/item[sc:fld('BreakingNewsStory',.)][1]">

.... но потом он его схватит перед заказом.

Я собирался поставить еще один foreach после предложения sort, чтобы затем получить первый элемент, но я подумал, что это будет излишне сложно, идолжен был быть более простой способ сделать то, что я пытаюсь сделать.

1 Ответ

4 голосов
/ 24 ноября 2011

Если я правильно понимаю, вы можете попробовать использовать position(), чтобы получить первый элемент:

<xsl:for-each select="sc:item('/sitecore/content/Home',.)/item[sc:fld('BreakingNewsStory',.)]">
<xsl:sort select="sc:fld('PublishDate',.)" order="ascending" />
  <xsl:if test="position() = 1">
    Article Name: <xsl:value-of select="@name" /><br />
    Title: <sc:text field="title"/> <br />
  </xsl:if>
</xsl:for-each> 
...