2

質問を投稿するのはこれが初めてです。

jQueryタブスライダー機能を備えたCQWPをまとめようとしています。出力したい HTML は、2 つの UL の形式である必要があります。#associated-ul-id を持つ li アンカー タグを持つ最初の

2 番目の UL には、最初のリスト項目に関連付けられた ID が必要です。例えば

<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 回通過して、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('&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>

2 番目の for-each ループでは、新しいリスト id="tabs-1"、id="tabs-2" などごとに id の末尾に番号を追加できるようにカウンターを設定するのに問題があります。 .

理論的には、for-each ループの外でパラメーターを設定し、ループ内でパラメーター値を取得してインクリメントするテンプレートを呼び出す必要があると思います。これは、テンプレートが呼び出されたときにのみ増加することを意味します。

必要な値に対応していないため、これには position() を使用できません。xsl を使用した再帰的プログラミングに関するいくつかのブログをフォローしようとしましたが、機能するものが見つからないようです。私は XSL を間違って書いているだけだと確信していますが、今はちょっとしたブレイン ダンプを抱えています。

誰かが私を正しい方向に向けることができれば、それは素晴らしいことです. どうもありがとう。

4

1 に答える 1

1

宣言後に変数の値を変更することはできません。それらを式で使用したり、パラメーターとして渡すことができます。したがって、外部変数をカウンターとして明示的に使用することはできません。利用可能なトリックの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>

結果:1、2、3、4、5

于 2012-03-27T10:55:36.283 に答える