У меня есть набор данных XML, которые я пытаюсь просмотреть и определить, сколько элементов имеют дату менее 1 недели.
ДАННЫЕ:
<events>
<event>
<eventDate>20110504</date>
<description>whatever</description>
</event>
<event>
<eventDate>20110720</date>
<description>whatever</description>
</event>
.
.
.
<event>
<eventDate>20111210</date>
<description>whatever</description>
</event>
</events>
XSLT:
<xsl:variable name="events" select="sc:item('/sitecore/content/Home/Upcoming Events',.)" />
<xsl:variable name="now" select="dateutil:get_IsoNow()" />
<xsl:variable name="counter" select="0" />
<xsl:template match="*">
<xsl:apply-templates select="$sc_item" mode="main"/>
</xsl:template>
<xsl:template match="*" mode="main">
<xsl:choose>
<xsl:when test="count($events/item) > 0">
<xsl:for-each select="$events/item">
<xsl:sort select="sc:fld('eventDate',.)" order="ascending"/>
<xsl:variable name="date_difference">
<xsl:call-template name="date-difference">
<xsl:with-param name="item-year" select="substring(sc:fld('eventDate',.),1,4)" />
<xsl:with-param name="item-month" select="substring(sc:fld('eventDate',.),5,2)" />
<xsl:with-param name="item-day" select="substring(sc:fld('eventDate',.),7,2)" />
<xsl:with-param name="today-year" select="substring(substring($now,1,8),1,4)" />
<xsl:with-param name="today-month" select="substring(substring($now,1,8),5,2)" />
<xsl:with-param name="today-day" select="substring(substring($now,1,8),7,2)" />
</xsl:call-template>
</xsl:variable>
<xsl:if test="($date_difference < 8)">
<p>
<sc:text field="eventDate" /><br />
<sc:text field="description" />
</p>
**** Increment a counter variable ****
$counter++
</xsl:if>
</xsl:for-each>
**** Check the counter variable ****
<xsl:if test="($counter = 0)">
<p>No upcoming events are scheduled at this time.</p>
</xsl:if>
</xsl:when>
<xsl:otherwise>
<p>No upcoming events are scheduled at this time.</p>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="date-difference">
<xsl:param name="item-year" />
<xsl:param name="item-month" />
<xsl:param name="item-day" />
<xsl:param name="today-year" />
<xsl:param name="today-month" />
<xsl:param name="today-day" />
<xsl:variable name="jul-item">
<xsl:call-template name="calculate-julian-day">
<xsl:with-param name="year" select="$item-year" />
<xsl:with-param name="month" select="$item-month" />
<xsl:with-param name="day" select="$item-day" />
</xsl:call-template>
</xsl:variable>
<xsl:variable name="jul-today">
<xsl:call-template name="calculate-julian-day">
<xsl:with-param name="year" select="$today-year" />
<xsl:with-param name="month" select="$today-month" />
<xsl:with-param name="day" select="$today-day" />
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="$jul-today - $jul-item" />
</xsl:template>
<xsl:template name="calculate-julian-day">
<xsl:param name="year" />
<xsl:param name="month" />
<xsl:param name="day" />
<xsl:variable name="a" select="floor((14 - $month) div 12)" />
<xsl:variable name="y" select="$year + 4800 - $a" />
<xsl:variable name="m" select="$month + 12 * $a - 3" />
<xsl:value-of select="$day + floor((153 * $m + 2) div 5) + $y * 365 + floor($y div 4) - floor($y div 100) + floor($y div 400) - 32045" />
</xsl:template>
Я знаю, что не могу изменить значение переменной в XSLT, поскольку они на самом деле являются константами.
Я знаю, что мне нужно использовать какую-то рекурсию.
Я просто не могу понять, как это сделать ... Я действительно в замешательстве.
Может кто-нибудь помочь, пожалуйста?