У меня есть следующий набор данных XML (упрощенный), где я могу иметь от нуля до бесконечных элементов (обычно их будет 2-10):
<item template="event_element">
<mytitle>This is the first title</mytitle>
<mydate>20110330T143004</mytitle>
<mydescription>This is the first description</mytitle>
<mylink>www.example.com</mytitle>
</item>
.
.
<item template="event_element">
<mytitle>This is the Tenth title</mytitle>
<mydate>20110330T143004</mytitle>
<mydescription>This is the tenth description</mytitle>
<mylink>www.example.com</mytitle>
</item>
Мой конечный результат должен быть таким, где я могу получить несколько наборов элементов (которые будут поворачиваться при помощи javascript):
<div class="body">
<div class="rel" id="arrangement">
// First set of items goes here
<div class="item">
<div class="itm">
<div class="in">
<p>
<a href="MY LINK" title="MY LINK DESCRIPTION">
<span>MY DATE</span>
<strong>MY FIRST TITLE</strong>
MY SHORT DESCRIPTION...
</a>
</p>
</div>
</div>
<div class="itm last">
<div class="in">
<p>
<a href="MY LINK" title="MY LINK DESCRIPTION">
<span>30. mar 2011</span>
<strong>MY SECOND TITLE</strong>
MY SHORT DESCRIPTION...
</a>
</p>
</div>
</div>
<div class="clr"></div>
</div>
// Second set of items goes here
<div class="item">
<div class="itm">
<div class="in">
<p>
<a href="MY LINK" title="MY LINK DESCRIPTION">
<span>MY DATE</span>
<strong>MY THIRD TITLE</strong>
MY SHORT DESCRIPTION...
</a>
</p>
</div>
</div>
<div class="itm last">
<div class="in">
<p>
<a href="MY LINK" title="MY LINK DESCRIPTION">
<span>30. mar 2011</span>
<strong>MY FORTH TITLE</strong>
MY SHORT DESCRIPTION...
</a>
</p>
</div>
</div>
<div class="clr"></div>
</div>
<div class="clr"></div>
</div>
Моя проблема состоит в том, чтобы пройтись по моим элементам (которые должны быть даже отсортированы по дате desc) и сгруппировать их в наборы по два.
Как и сегодня, я был вынужден жестко закодировать такие наборы (переменные $ eventfolder, $ totalevents были предопределены):
<pre><code><div class="body">
<div class="rel" id="arrangement">
<xsl:if test="$totalevents > 0">
<div class="item">
<xsl:for-each select="$eventfolder/item[@template='event_element' and position() > 0 and position() < 3]">
<xsl:choose>
<xsl:when test="position() < $eventsperpage">
<div class="itm">
<xsl:call-template name="renderEvent" />
</div>
</xsl:when>
<xsl:otherwise>
<div class="itm last">
<xsl:call-template name="renderEvent" />
</div>
<div class="clr"></div>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</div>
</xsl:if>
<xsl:if test="$totalevents > 2">
<div class="item">
<xsl:for-each select="$eventfolder/item[@template='event_element' and position() > 2 and position() < 5]">
<xsl:choose>
<xsl:when test="position() < $eventsperpage">
<div class="itm">
<xsl:call-template name="renderEvent" />
</div>
</xsl:when>
<xsl:otherwise>
<div class="itm last">
<xsl:call-template name="renderEvent" />
</div>
<div class="clr"></div>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</div>
</xsl:if>
<div class="clr"></div>
</div>
</div>
Шаблон renderElement просто отображает внутреннее событие HTML.
Но этот способ не очень практичен, если я хотел показать больше наборов, чем 2 - или даже показать больше элементов в каждом наборе ... Файл xslt был бы большим и нечитаемым ...
Любая помощь в том, как я могу решить эту проблему, поскольку я не могу понять, как вставить HTML-теги, поскольку компилятор XSLT не может видеть их закрывающимися - т.е. (когда test="position() = 1
вставить начальный тег html, а затем позже, когда test="position() = X
закрыть тег).
Заранее спасибо