这是我第一次发布问题,如果我在这里插话,请提前道歉。
我正在尝试将CQWP与jQuery选项卡滑块功能组合在一起。我想要输出的HTML应该是2个UL的形式。第一个带有li锚标签的#associated ul-id
第二个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>
对于每个循环的第二个循环,我在设置计数器时遇到了问题,这样我就可以将数字添加到每个新列表id="tabs-1"、id="tabs-2"等的id末尾。
理论上,我认为我应该为每个循环在我的外部设置一个参数,然后在循环中调用一个获取参数值并将其递增的模板。这意味着只有当调用模板时,它才会递增。
我不能使用position(),因为它与我想要的值不一致。我试着关注了几个关于xsl递归编程的博客,但似乎找不到任何有效的方法。我确信我只是把XSL写错了,但我现在有点头脑混乱。
如果有人能给我指一个正确的方向,那就太棒了。非常感谢。
声明后不能更改变量的值。您可以在表达式中使用它们和/或将其作为参数传递。因此,您不能显式地使用外部变量作为计数器。一个可用的技巧是递归循环,如:
<?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