Счетчик XSL при определенных условиях для SharePoint 2010 CQWP

Это первый раз, когда я когда-либо размещал вопрос, поэтому заранее извиняюсь, если я таращусь здесь.

Я пытаюсь собрать CQWP с функциональностью слайдера вкладок jQuery. HTML, который я хочу вывести, должен быть в виде 2 UL. Первый с анкорными тегами li с #associated-ul-id

Второй ul должен иметь идентификаторы, связанные с элементами списка в первом. Например

<div id="tabs" class="news">
    <div class="news-pagination">
        <a href="#" id="carouseltext-prev">&laquo; 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">&raquo; Next</a>
        <div class="clear">&nbsp;</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 равны истине. Я урезал функциональность здесь, чтобы просто вывести заголовок. Вот урезанная версия 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('&lt;ul id=&quot;tabs-')" />
        <xsl:variable name="BeginNewsItemsList2" select="string('&quot;class=&quot;feed order&quot;&gt;')" />
        <xsl:variable name="BeginNewsItemsList" select="concat($BeginNewsItemsList1, $ColNumber, $BeginNewsItemsList2)" />

        <xsl:if test="($CurPosition &gt;= $FirstRow and $CurPosition &lt;= $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, но сейчас у меня что-то вроде мозговой свалки.

Если бы кто-нибудь мог указать мне в правильном направлении, это было бы здорово. Большое спасибо.


person Dee    schedule 26.03.2012    source источник
comment
Просто чтобы добавить, я знаю, что могу легко сделать это с помощью jQuery, но я пытаюсь свести сценарии на стороне клиента к минимуму.   -  person Dee    schedule 26.03.2012
comment
Непонятно, пытаетесь ли вы решить проблему jQuery или xsl ) Если второе - просто предоставьте свой xsl )   -  person Timur Sadykov    schedule 26.03.2012
comment
Я борюсь с увеличением XSL. Я просто хочу получить #tabs-1, #tabs-2 в якорях первого элемента списка, а затем id=tabs-1 и т. д. в элементах списка второго списка. Вот урезанная версия XSL   -  person Dee    schedule 27.03.2012
comment
Извините, что я так долго не отвечал, я думал, что когда кто-то ответил, приходят автоматические электронные письма. Был куклой! В любом случае, теперь он у меня всегда открыт :) Спасибо за ответ!!   -  person Dee    schedule 27.03.2012
comment
намного лучше, но все еще сбивает с толку) Лучший способ - предоставить полный набор входных и желаемых выходных данных - чтобы поэкспериментировать)   -  person Timur Sadykov    schedule 27.03.2012


Ответы (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 &lt; $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>

result: 1, 2, 3, 4, 5

person Timur Sadykov    schedule 27.03.2012
comment
Спасибо Тимур. Это похоже на то, что я хочу сделать, но мне нужно иметь возможность просто увеличивать значение при двух разных условиях (либо когда $StartNewGroup и $StartNewColumn равны true и $CurPosition = $FirstRow, либо когда $StartNewGroup = true). Поэтому мне нужно было бы вызвать шаблон в условных операторах внутри цикла for-seach $Rows, используя глобальный параметр. Скорее всего, он будет вызываться каждые 10-20 строк, когда $NewGroup имеет значение true, поэтому его нельзя настроить в структуре типа for 1-5. - person Dee; 28.03.2012
comment
Кажется, что это может быть довольно сложно сделать, чтобы избежать использования jQuery, чтобы попытаться сохранить вещи на стороне сервера. Другим вариантом было бы добавить числа к якорям и стороне клиента id с помощью jQuery, как только я сделал все остальное с помощью XSL. Как вы думаете, это лучший способ сделать это? - person Dee; 28.03.2012
comment
какая у вас серверная технология? Почему ты так зациклился на xsl? - person Timur Sadykov; 28.03.2012
comment
Я использую SharePoint 2010. Думаю, я перестарался, пытаясь использовать для этого XSL. Я буду использовать jQuery. Думал, что, возможно, я просто не смог понять что-то простое в XSL, но я просто счастлив, когда это легко сделать с помощью jQuery. Извините, Тимур, и большое спасибо за помощь!! :) - person Dee; 28.03.2012