所以我的头撞在墙上已经有一段时间了,正在寻求帮助。我正试图在sharepoint设计器中创建一个新的项目样式,它基本上检查任务列表中的每个项目,然后统计"已完成"、"正在进行"one_answers"未开始"状态的总数。据我所知,问题在于xsl没有可变变量。到目前为止,我所拥有的是:
<xsl:variable name="sChk">
<xsl:value-of select="@Status"/>
</xsl:variable>
<xsl:for-each select="@Status">
<xsl:if test="$sChk = 'Completed' ">
<!-- Add to Completed Counter -->
</xsl:if>
<xsl:if test="$sChk = 'In Progress' ">
<!-- Add to In Progress Counter -->
</xsl:if>
<xsl:if test="$sChk = 'Not Started' ">
<!-- Add to Not Started Counter -->
</xsl:if>
<br/>
</xsl:for-each>
Out Of Loop:
Total Completed: <!-- Completed Value -->
Total In Progress: <!-- In Progress Value -->
Total Not Started: <!-- Not Started Value -->
任何帮助都将不胜感激,谢谢!
编辑:所以我也尝试过这种递归方法,但也不起作用。。。
<xsl:param name="cCount" select="0"/>
<xsl:param name="ipCount" select="0"/>
<xsl:param name="nsCount" select="0"/>
<xsl:choose>
<xsl:when test="$sChk = 'Completed'">
<xsl:call-template name="PSRView2.0">
<xsl:with-param name="cCount" select="$cCount +1"/>
<xsl:with-param name="ipCount" select="$ipCount"/>
<xsl:with-param name="nsCount" select="$nsCount"/>
</xsl:call-template>
</xsl:when>
<xsl:when test="$sChk = 'In Progress'">
<xsl:call-template name="PSRView2.0">
<xsl:with-param name="cCount" select="$cCount"/>
<xsl:with-param name="ipCount" select="$ipCount +1"/>
<xsl:with-param name="nsCount" select="$nsCount"/>
</xsl:call-template>
</xsl:when>
<xsl:when test="$sChk = 'Not Started'">
<xsl:call-template name="PSRView2.0">
<xsl:with-param name="cCount" select="$cCount"/>
<xsl:with-param name="ipCount" select="$ipCount"/>
<xsl:with-param name="nsCount" select="$nsCount +1"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$cCount"/>
<xsl:value-of select="$ipCount"/>
<xsl:value-of select="$nsCount"/>
</xsl:otherwise>
</xsl:choose>
在XSLT中,变量是不可变的,这一点是正确的。在这种情况下,您需要使用count函数,该函数对节点集中的所有项进行计数。类似这样的东西:
<xsl:variable name="completed" select="count(task[@Status='Completed'])" />
<xsl:variable name="inprogress" select="count(task[@Status='In Progress'])" />
<xsl:variable name="notstarted" select="count(task[@Status='Not Started'])" />
Total: <xsl:value-of select="$completed + $inprogress + $notstarted" />
当然,您需要将"task"替换为您在XSLT中使用的任何元素名称。
如果看不到XML,很难给出准确的答案,但作为一个例子,请考虑以下XML
<tasklist>
<task status="Completed" />
<task status="Completed" />
<task status="In Progress" />
</tasklist>
然后XSLT(仅用于获取总数)看起来像这个
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="tasklist">
<xsl:variable name="completed" select="count(task[@Status='Completed'])" />
<xsl:variable name="inprogress" select="count(task[@Status='In Progress'])" />
<xsl:variable name="notstarted" select="count(task[@Status='Not Started'])" />
Total: <xsl:value-of select="$completed + $inprogress + $notstarted" />
</xsl:template>
</xsl:stylesheet>
请注意,您需要如何定位在此处所有单个"task"元素的父元素上。作为一种选择,你可以做这样的事情。。。
<xsl:variable name="completed" select="count(//task[@Status='Completed'])" />
这将计算任务元素在XML中的任何位置。
如果您真的不知道元素名称,但确信没有其他带有"状态"属性的元素,您甚至可以执行以下操作:
<xsl:variable name="completed" select="count(//*[@Status='Completed'])" />