2012-03-26 5 views
2

Dies ist das erste Mal, dass ich jemals eine Frage so im Voraus entschuldigen, wenn ich hier jibber.XSL-Counter auf bestimmte Bedingung für SharePoint 2010 CQWP

Ich versuche, eine CQWP mit jQuery Tabs Slider-Funktionalität zusammen. Der HTML-Code, den ich ausgeben möchte, sollte in Form von 2 ULs vorliegen. Die erste mit li-Anchor-Tags mit # associated-ul-id

Die zweite ULs sollten IDs haben, die mit den Listenelementen in der ersten verknüpfen.

zB
<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> 

Die ursprüngliche XML startet zweimal in Form

Mein XSL geht durch die XML-off die 2 ul des zu füllen. Beim ersten Mal wird nur ein neues Listenelement hinzugefügt, wenn die Variablen __begincolumn und __bewegingroup true sind. Ich habe hier die Funktionalität gestrafft, um nur den Header auszugeben. Hier ist eine abgespeckte Version des 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> 

Für die zweite foreach-Schleife Ich habe Probleme, einen Zähler einrichten, so dass ich die Nummer an das Ende der ID für jede neue Liste id hinzufügen = "Tabs-1", ID = "Tabs-2", etc.

In der Theorie denke ich, ich sollte einen Parameter außerhalb meiner for-each-Schleife festlegen und dann in der Schleife eine Vorlage aufrufen, die den Parameterwert und Inkrementen erhält es. Das würde bedeuten, dass es nur erhöht wird, wenn die Vorlage aufgerufen wird.

Ich kann position() nicht verwenden, da es nicht den gewünschten Werten entspricht. Ich habe versucht, ein paar Blogs über rekursive Programmierung mit xsl zu folgen, aber ich kann nichts finden, was funktioniert. Ich bin mir sicher, ich schreibe gerade die XSL falsch, aber ich habe jetzt ein bisschen eine Gehirn-Dump.

Wenn mir jemand in die richtige Richtung zeigen könnte, wäre das genial. Vielen Dank.

+0

nur hinzufügen, ich weiß, dass ich dies einfach mit jQuery tun kann, aber ich Ich versuche, das clientseitige Scripting auf ein Minimum zu beschränken. – Dee

+0

... und es ist XSL Version 1.0 – Dee

+0

Es ist nicht klar, ob Sie versuchen, jQuery Problem oder xsl zu lösen) Wenn zweitens - geben Sie einfach Ihre xsl –

Antwort

1

Sie können die Werte der Variablen nach der Deklaration nicht ändern. Sie können sie in Ausdrücken verwenden und/oder als Parameter übergeben. Daher können Sie keine externe Variable explizit als Zähler verwenden. Ein freier Trick ist rekursiven Zyklus wie:

 <?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> 

Ergebnis: 1, 2, 3, 4, 5

+0

Danke Timur.Es ist ähnlich wie das, was ich tun möchte, aber ich muss in der Lage sein, nur zwei verschiedene Bedingungen zu erhöhen (entweder wenn $ StartNewGroup und $ StartNewColumn wahr sind und $ CurPosition = $ FirstRow oder wenn $ StartNewGroup = true). Also würde ich eine Vorlage in den bedingten Anweisungen innerhalb der for-seach $ Rows Schleife mit einem globalen Parameter aufrufen müssen. Es wird wahrscheinlich alle 10-20 Zeilen aufgerufen, wenn die $ NewGroup wahr ist, so dass es nicht in einer Struktur vom Typ 1-5 eingerichtet werden könnte. – Dee

+0

Es scheint, als wäre es eine ziemlich komplizierte Sache zu tun, um zu vermeiden, jQuery zu verwenden, um Dinge serverseitig zu behalten. Die andere Möglichkeit wäre, die Zahlen der Clientseite der Anker und ID mit jQuery hinzuzufügen, sobald ich alles andere mit XSL gemacht habe. Denkst du, dass das ein besserer Weg ist? – Dee

+0

Was ist Ihre serverseitige Technologie? Warum bist du so an xsl gebunden? –

Verwandte Themen