Счетчик XSL при определенных условиях для SharePoint 2010 CQWP
Это первый раз, когда я когда-либо извиняюсь за вопрос заранее, если я буду здесь трепаться.
Я пытаюсь собрать CQWP с функциональностью слайдера вкладок jQuery. HTML-код, который я хочу вывести, должен быть в форме 2 UL. Первый с тегами привязки li с # related-ul-id
У второго ul должны быть идентификаторы, которые ассоциируются с элементами списка в первом. Например
<div id="tabs" class="news">
<div class="news-pagination">
<a href="#" id="carouseltext-prev">« Prev</a>
<ul id="carouseltext" class="horizontal-text order">
<li><a href="#tabs-1">System</a></li>
<li><a href="#tabs-2">School</a></li>
</ul>
<a href="#" id="carouseltext-next">» Next</a>
<div class="clear"> </div>
</div>
<ul id="tabs-1" class="feed order">
<li>title 1</li>
<li>title 2</li>
</ul>
<ul id="tabs-2" class="feed order">
<li>title 3</li>
</ul>
</div>
Оригинальный XML начинается в форме
Мой XSL проходит через XML дважды, чтобы заполнить 2 ul. В первый раз он просто добавляет новый элемент списка, когда переменные __begincolumn и __begingroup имеют значение true. Я сократил функциональность здесь, чтобы просто вывести заголовок. Вот урезанная версия XSL
<xsl:template match="/">
<xsl:variable name="Rows" select="/dsQueryResponse/Rows/Row" />
<xsl:variable name="RowCount" select="count($Rows)" />
<xsl:variable name="FirstRow" select="1" />
<xsl:param name="ColNumber" select="1" />
<xsl:for-each select="$Rows" >
<xsl:variable name="CurPosition" select="position()" />
<xsl:variable name="BeginNewsItemsList1" select="string('<ul id="tabs-')" />
<xsl:variable name="BeginNewsItemsList2" select="string('"class="feed order">')" />
<xsl:variable name="BeginNewsItemsList" select="concat($BeginNewsItemsList1, $ColNumber, $BeginNewsItemsList2)" />
<xsl:if test="($CurPosition >= $FirstRow and $CurPosition <= $LastRow)">
<xsl:variable name="StartNewGroup" select="@__begingroup = 'True'" />
<xsl:variable name="StartNewColumn" select="@__begincolumn = 'True'" />
<xsl:when test="$StartNewGroup and $StartNewColumn">
<xsl:choose>
<xsl:when test="$CurPosition = $FirstRow">
<xsl:value-of disable-output-escaping="yes" select="$BeginNewsItemsList" />
</xsl:when>
<xsl:otherwise>
<!-- other instructions -->
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:when test="$StartNewGroup">
<xsl:call-template name="OuterTemplate.CallFooterTemplate"/>
<xsl:value-of disable-output-escaping="yes" select="concat($EndColumn, $BeginNewsItemsList)" />
</xsl:when>
<xsl:otherwise>
</xsl:otherwise>
</xsl:if>
</xsl:for-each>
</xsl:template>
<xsl:template name="OuterTemplate.Count">
<xsl:param name="ColNumber" />
<xsl:value-of select="$ColNumber + 1" />
</xsl:template>
Для второго цикла for-each у меня возникают проблемы при настройке счетчика, чтобы я мог добавить число в конец идентификатора для каждого нового списка id="tabs-1", id="tabs-2" и т. Д.,
В теории я думаю, что я должен установить параметр вне моего цикла for-each, а затем в цикле вызвать шаблон, который получает значение параметра и увеличивает его. Это будет означать, что он будет увеличиваться только при вызове шаблона.
Я не могу использовать position() для этого, так как он не соответствует значениям, которые я хочу. Я попытался подписаться на пару блогов о рекурсивном программировании с помощью xsl, но я не могу найти ничего, что работает. Я уверен, что просто пишу XSL неправильно, но сейчас у меня немного мозгов.
Если бы кто-нибудь мог указать мне правильное направление, это было бы здорово. Спасибо большое.
1 ответ
Вы не можете изменить значения переменной после объявления. Вы можете использовать их в выражениях и / или передавать в качестве параметров. Таким образом, вы не можете использовать внешнюю переменную в качестве счетчика явно. Одним из доступных трюков является рекурсивный цикл, такой как:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="root">
<HTML>
<BODY>
<xsl:call-template name="for">
<xsl:with-param name="i" select="1"/>
<xsl:with-param name="n" select="5"/>
</xsl:call-template>
</BODY>
</HTML>
</xsl:template>
<xsl:template name="for">
<xsl:param name="i"/>
<xsl:param name="n"/>
<xsl:value-of select="$i"/>
<xsl:if test="$i < $n">
<xsl:text>, </xsl:text>
<xsl:call-template name="for">
<xsl:with-param name="i" select="$i+1"/>
<xsl:with-param name="n" select="$n"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
результат: 1, 2, 3, 4, 5