【问题标题】:XSL counter on specific condition for SharePoint 2010 CQWPSharePoint 2010 CQWP 特定条件下的 XSL 计数器
【发布时间】:2012-03-27 19:00:38
【问题描述】:

这是我第一次发布这样的问题,如果我在这里胡言乱语,请提前致歉。

我正在尝试将 CQWP 与 jQuery 选项卡滑块功能放在一起。我要输出的 HTML 应该是 2 UL 的形式。第一个带有 li 锚标记的 #related-ul-id

第二个 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 个 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 的 id 末尾"等。

理论上我认为我应该在我的 for-each 循环之外设置一个参数,然后在循环中调用一个模板来获取参数值并增加它。这意味着它只会在调用模板时递增。

我不能使用 position() 因为它不符合我想要的值。我尝试关注一些关于使用 xsl 进行递归编程的博客,但我似乎找不到任何有用的东西。我确定我只是写错了 XSL,但我现在有点脑残。

如果有人能指出我正确的方向,那就太棒了。非常感谢。

【问题讨论】:

  • 只是补充一点,我知道我可以使用 jQuery 轻松做到这一点,但我试图将客户端脚本保持在最低限度。
  • 目前尚不清楚,您是在尝试解决 jQuery 问题还是 xsl )如果是第二个 - 只需提供您的 xsl )
  • 这是我正在努力解决的 XSL 增量问题。我只想在第一个列表项锚点上获取#tabs-1、#tabs-2,然后在第二个列表的列表项上获取 id=tabs-1 等。这是 XSL 的精简版
  • 对不起,我花了这么长时间才回复,我以为有人回复时会有自动电子邮件。本来就是个布偶!反正我现在一直都开着:)谢谢你的回复!!
  • 好多了,但仍然令人困惑)最好的方法是提供完整的输入和所需的输出数据集 - 进行实验)

标签: xslt sharepoint-2010 cqwp content-query-rollup


【解决方案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

【讨论】:

  • 谢谢帖木儿。这与我想要做的类似,但我需要能够在 2 个不同的条件下递增(当 $StartNewGroup 和 $StartNewColumn 为 true 并且 $CurPosition = $FirstRow 或 $StartNewGroup = true 时)。因此,我需要使用全局参数在 for-seach $Rows 循环内的条件语句中调用模板。当 $NewGroup 为真时,它可能每 10-20 行被调用一次,因此它无法设置为 for 1-5 类型的结构。
  • 为了避免使用 jQuery 尝试将事情保持在服务器端,这似乎是一件相当复杂的事情。另一个选择是在我使用 XSL 完成其他所有操作后,使用 jQuery 将数字添加到锚点和 id 的客户端。你认为这是一种更好的方法吗?
  • 您的服务器端技术是什么?你为什么这么坚持xsl?
  • 我正在使用 SharePoint 2010。我想我可能在尝试为此使用 XSL 方面做得过火了。我将使用 jQuery。以为我可能只是无法理解 XSL 中简单的东西,但是当使用 jQuery 很容易做到这一点时,我只是一个李子。对不起帖木儿,非常感谢您的帮助!! :)
猜你喜欢
  • 2013-08-14
  • 2013-02-27
  • 1970-01-01
  • 1970-01-01
  • 2013-05-02
  • 1970-01-01
  • 1970-01-01
  • 2011-08-16
  • 2022-01-02
相关资源
最近更新 更多