Sharepoint List和XSLT - 带变量的条件循环?

时间:2015-01-29 16:49:39

标签: xslt sharepoint

以下是我的方案:我正在开发一个在Sharepoint 2010中构建的电子商务网站。我正在制作一个由List驱动的产品目录,并由XSLT样式表设计。

(当前)问题:某些产品不时有促销活动。我的列表中有一个字段,其中包含促销文本,如果是促销,还有一个复选标记(是/否)。如果是,我的样式表将显示该促销文本 - 否则它将只是正常产品。

然而,我需要一种动态的方法来在促销文本的末尾添加像 1 这样的上标数字。这是免责声明。

在仅包含促销产品的页面上,这很容易:我只使用由<sup></sup>包裹的position()函数增加1。

以下是我的代码的一部分,启动循环:

 <div>
 <xsl:for-each select="$Rows">
 <xsl:call-template name="dvt_1.rowview" />
 </xsl:for-each>
 </div>

然后是模板:

 <xsl:template name="dvt_1.rowview">
 <xsl:variable name="PromotionVar"><xsl:value-of select="@OnPromotion"/>       </xsl:variable>

然后测试促销:

 <xsl:if test="$PromotionVar='Yes'">
            <p class="text-red">Promotion: <xsl:value-of select="@PromotionText1" disable-output-escaping="yes"/>
            <sup>
            <xsl:variable name="i" select="position()" />
                <xsl:copy>
                    <xsl:value-of select="$i"/>
                </xsl:copy>
                </sup>
                </p>
    </xsl:if>
 </xsl:template>

但是,对于产品不在促销中的网页,这不起作用,因为position()基于所有匹配的记录。

现在如果这是另一种脚本语言,如Javascript,我可以只分配一个变量并在if语句中递增它。但是从Stackoverflow上搜索,我明白XSLT是一种函数式语言,变量实际上是不可变的。那我应该怎么做呢?

这是另一个可能有我需要的答案。或者不是。这有点复杂。

In XSLT how do I increment a global variable from a different scope?

有谁知道我应该怎么做?感谢。

1 个答案:

答案 0 :(得分:0)

在极端偶然的机会中有人读到了这个问题,我已经找到了使用JQuery的解决方案。

首先,我为名为&#34; promo_super&#34;的标签组成了一些类。促销活动,&#34; disclosure_super&#34;披露。这是在我的XSLT样式表中:

<xsl:if test="$PromotionVar='Yes'">
    <p class="text-red"><strong>Promotion: 
    <xsl:value-of select="@PromotionText1" disable-output-escaping="yes"/>
    <sup><a href="#disclosures" class="promo_super">X</a></sup>
    </strong></p>
</xsl:if>

然后在我的JQuery脚本中,我放在页面的底部(所以它在列表呈现后执行):

<script>

var promoNumber = 0;

$(".promo_super").each(function() {
    var text = $(this).text();
    promoNumber = promoNumber + 1;
    text = text.replace("X", promoNumber);
    $(this).text(text);
});

在此代码中,我创建了一个变量,用于对我的促销进行编号。然后,对于该类的每个实例(.promo_super),我替换了&#39; X&#39;在标签之间,我将该数字增加1。

var disclosureNumber = 0;

$(".disclosure_super").each(function() {
    var text = $(this).text();
    disclosureNumber = disclosureNumber + 1;
    text = text.replace("X", disclosureNumber);
    $(this).text(text);
});
</script>

我对我的披露做了同样的事情,使用了不同的变量和类,所以我不会将这些数字加在一起。排序顺序由View的过滤器处理,因此假设两个列表的排序相同,则数字将匹配。

也许这不是最优雅的解决方案,但似乎工作正常!