基于<xsl:choose>语句的列总和

时间:2016-12-06 17:53:44

标签: xslt sharepoint-2010 xslt-1.0 dataviewwebpart

我在Sharepoint 2010数据视图中有一个表,其列的计算方法如下:

<td>
<xsl:variable name="CurrentYear" select="ddwrt:FormatDateTime(string(ddwrt:Today()),1033,'yyyy')"/>
<xsl:variable name="YearOfWork" select="$thisNode/@Year"/>
    <xsl:choose>
     <xsl:when test="number($YearOfWork) = number($CurrentYear) - 1">
       <xsl:value-of select="number(@_x004a_an116)"/>
     </xsl:when>
     <xsl:when test="number($YearOfWork) + 1 = number($CurrentYear) - 1">
       <xsl:value-of select="number(@_x004a_an1)"/>
     </xsl:when>
     <xsl:when test="number($YearOfWork) + 2 = number($CurrentYear) - 1">
       <xsl:value-of select="number(@_x004a_an1)"/>
     </xsl:when>
     <xsl:otherwise>
       <xsl:value-of select="number(0.00)"/>
     </xsl:otherwise>
    </xsl:choose>
</td>

在列的底部,我想获得列中所有值的总和。有没有办法做到这一点?

提前致谢!

1 个答案:

答案 0 :(得分:0)

您可以将输入预处理为node-set并对其应用多个变换。这确实需要扩展,但它可以广泛使用。

我以此输入为例:

<vals>
    <val Year="2016" _x004a_an116="100" _x004a_an1="150"/>
    <val Year="2015" _x004a_an116="200" _x004a_an1="250"/>
    <val Year="2014" _x004a_an116="300" _x004a_an1="350"/>
    <val Year="2013" _x004a_an116="400" _x004a_an1="450"/>
    <val Year="2012" _x004a_an116="500" _x004a_an1="550"/>
</vals>

然后将此样式表预处理到$vals变量中,然后输出行和最终总数:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:exsl="http://exslt.org/common"
                exclude-result-prefixes="exsl">

    <xsl:output indent="yes" omit-xml-declaration="yes"/>

    <xsl:template match="/vals">
        <xsl:variable name="CurrentYear" select="2016"/>
        <xsl:variable name="vals">
            <xsl:for-each select="val">
                <tr>
                    <td><xsl:value-of select="@Year"/></td>
                    <td>
                        <xsl:variable name="YearOfWork" select="number(@Year)"/>
                        <xsl:choose>
                            <xsl:when test="$YearOfWork = $CurrentYear - 1">
                                <xsl:value-of select="@_x004a_an116"/>
                            </xsl:when>
                            <xsl:when test="$YearOfWork + 1 = $CurrentYear - 1">
                                <xsl:value-of select="@_x004a_an1"/>
                            </xsl:when>
                            <xsl:when test="$YearOfWork + 2 = $CurrentYear - 1">
                                <xsl:value-of select="@_x004a_an1"/>
                            </xsl:when>
                            <xsl:otherwise>
                                <xsl:value-of select="0.00"/>
                            </xsl:otherwise>
                        </xsl:choose>
                    </td>
                </tr>
            </xsl:for-each>
        </xsl:variable>

        <table>
            <xsl:copy-of select="$vals"/>
            <xsl:call-template name="sum">
                <xsl:with-param name="rows" select="exsl:node-set($vals)"/>
            </xsl:call-template>
        </table>
    </xsl:template>

    <xsl:template name="sum">
        <xsl:param name="rows"/>
        <tr>
            <td>Total</td><td><xsl:value-of select="sum($rows/tr/td)"/></td>
        </tr>
    </xsl:template>

</xsl:stylesheet>