XSL брояч при специфично условие за SharePoint 2010 CQWP

Това е първият път, когато публикувам въпрос, така че се извинявам предварително, ако бърборя тук.

Опитвам се да събера CQWP с функционалност на плъзгача за раздели jQuery. HTML, който искам да изведа, трябва да бъде под формата на 2 UL. Първият с li anchor тагове с #associated-ul-id

Вторият ul трябва да има идентификатори, които се свързват с елементите от списъка в първия. напр

<div id="tabs" class="news">
    <div class="news-pagination">
        <a href="/bg#" id="carouseltext-prev">&laquo; Prev</a>
        <ul id="carouseltext" class="horizontal-text order">
            <li><a href="/bg#tabs-1">System</a></li>
            <li><a href="/bg#tabs-2">School</a></li>
        </ul>
        <a href="/bg#" 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
Благодаря ти Тимур. Подобно е на това, което искам да направя, но трябва да мога просто да увеличавам 2 различни условия (когато $StartNewGroup и $StartNewColumn са true и $CurPosition = $FirstRow или когато $StartNewGroup = true). Така че ще трябва да извикам шаблон в условните изрази вътре в цикъла $Rows за търсене, използвайки глобален параметър. Вероятно ще бъде извикван на всеки 10-20 реда, когато $NewGroup е верен, така че няма да може да бъде настроен в структура от тип 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