以下是我的方案:我正在开发一个在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?
有谁知道我应该怎么做?感谢。
答案 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的过滤器处理,因此假设两个列表的排序相同,则数字将匹配。
也许这不是最优雅的解决方案,但似乎工作正常!