Umbraco XSLT计算多个文本字符串中第一个值的媒体属性

时间:2013-01-08 06:34:54

标签: xslt count umbraco

我正在创建一个从当前成员中获取属性的宏。该属性使用“多文本字符串”数据类型,每个文本字符串包含由逗号分隔的三个值,媒体ID,版本号以及添加的日期和时间。

e.g。 1475,1,28-Dec-12 01:26:45(媒体ID,版本号,添加的日期和时间)

第一个值是介质ID,在该mediatype上我有一个“protectedFile”true / false属性。我想计算我的多个文本字符串列表中有多少项将该值设置为“true”

我尝试了以下内容:

<xsl:variable name="protectedFile">
        <xsl:for-each select="umbraco.library:GetCurrentMember()/assetDownloads/values/value">
                <xsl:variable name="contentSplit" select="umbraco.library:Split(current(), ',')" />
                <xsl:for-each select="$contentSplit/value">
                        <xsl:if test="position() = 1">
                                <xsl:if test="umbraco.library:GetMedia(., 0)/protectedFile != '0'">
                                        <xsl:value-of select="umbraco.library:GetMedia(., 0)/protectedFile" />
                                </xsl:if>
                        </xsl:if>
                </xsl:for-each>
        </xsl:for-each>
</xsl:variable>

<h3>Protected file: <xsl:value-of select="$protectedFile"/></h3>

但由于它是“for-each”,结果显示为: 受保护的文件:111

我需要它显示为计数受保护的文件:3

有人可以帮助我吗?

干杯, JV

1 个答案:

答案 0 :(得分:0)

为了在XSLT中添加/减少/ etc,您需要使用递归。这是使用xsl:call-template完成的,并且具有类似函数的辅助xsl:template。这样的事情就是一个简单的例子:

<xsl:variable name="incrementVal" select="1"/>

<xsl:template match="/">

  <xsl:call-template name="addLoop">
    <xsl:with-param name="inc" select="$incrementVal" />
    <xsl:with-param name="count" select="5" />
  </xsl:call-template>

</xsl:template>

<xsl:template name="addLoop">
  <xsl:param name="inc" />
  <xsl:param name="count" />

  <xsl:choose>
    <xsl:when test="$count = 0">
      <xsl:value-of select="$inc"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:call-template name="addLoop">
        <xsl:with-param name="inc" select="$inc + 1" />
        <xsl:with-param name="count" select="$count - 1" />
      </xsl:call-template>
    </xsl:otherwise>
  </xsl:choose>

</xsl:template>

将其放入测试XSLT并使用XSLT测试工具查看结果。