使用XSLT在DVWP中获取多值查找列的计数值

时间:2012-06-15 12:37:32

标签: sharepoint xslt sharepoint-2010

我正在构建一个“仪表板”,我正在使用DVWP和XSLT来显示客户端的事情,例如任务的总数,打开的数量,关闭的数量等等article

我的问题是我有一个多值查找列,我需要获取值的计数,但我无法使用我尝试过的结果生成任何结果。

关于如何完成的任何建议或建议都会很棒。

所以要将上面的内容添加为更新:

我不确定如何达到预期效果的最佳方法。基本上我有一个多值查找列,目前有20个值。客户端可以在需要时添加新值。所以我试图做的是获得他们为每条记录选择的值的总计类型计数。

所以让我们假设例如查询列有五(5)个值:

价值1 价值2 价值3 价值4 价值5

在newform.aspx中,他们可以选择多个值(因此可以选择值3和值5;或者值2,值4和值5等)。在列表视图中,它当然会显示应该选择的选项。我试图做的是得到这些值的总数。

例如,输出看起来像:

Value 1 : 5
Value 2 : 1
Value 3 : 2
Value 4 : 3
Value 5 : 6
Value 3 & 5 : 4

Value 2,4, & 5: 3

我不确定XSLT是否可以开发这样的东西,因为我之前没有用这么复杂的Lookup Column来做这件事。通常我会像下面那样做,但这只能让我了解基础知识,因为价值可以合并,我不确定如何处理:

<xsl:template name="dvt_1.body">
    <xsl:param name="Rows"/>
    <xsl:variable name="total1" select="count(/dsQueryResponse/Rows/Row/@MyLookupCol.[contains(.,'1;#Value1')])"></xsl:variable>
                    <xsl:call-template name="cs3_totalRow">
                        <xsl:with-param name="cs3_RowName1">
                            Value 1
                        </xsl:with-param>
                        <xsl:with-param name="cs3_RowValue1">
                            <xsl:value-of select="$total1"/>
                        </xsl:with-param>
                    </xsl:call-template>
            </xsl:template>

            <xsl:template name="totalsRow">
                <xsl:param name="RowName1"></xsl:param>
                <xsl:param name="RowValue1"></xsl:param>
                    <table>
                        <tr>
                            <td>
                                <xsl:value-of select="$cs3_RowName1"/>:
                            </td>
                            <td>
                                <xsl:value-of select="$cs3_RowValue1"/>
                            </td>
                        </tr>
                    </table>

1 个答案:

答案 0 :(得分:0)

行;弄清楚了。您将需要使用MUENCHIAN METHOD,它利用键来生成“不同分组依据”列表,然后在表达式中使用count并计算键。

使用的参考文献是herehere

有关详细信息,请参阅以下代码:

<!--GROUPING USING THE MUENCHIAN METHOD-->
<!--Add a key as shown below. This is important! Will not "group by" without it-->
<xsl:key name="YourKeyNameHere" match="Row" use="@YourColumnName"/>

   <xsl:template match="/">
      <!--Get your column values look you normally would-->
      <xsl:variable name="cbs_Rows" select="/dsQueryResponse/Rows/Row/@YourColumnName"/>
      <table border="0" width="100%" cellpadding="2" cellspacing="0">
         <tr valign="top">
            <th class="ms-vh" nowrap="nowrap">TheValueName</th>
            <th class="ms-vh" nowrap="nowrap">ValueTotals</th>
         </tr>
         <!--This gets the distinct strings for you.-->
         <xsl:for-each select="//Row[generate-id() = generate-id(key('YourKeyName', @YourColumnName)[1])]">
            <xsl:sort select="@YourColumnName"/>
            <xsl:for-each select="key('YourKeyName', @YourColumnName)">
                <xsl:call-template name="Rows.RowView" />
            </xsl:for-each>
         </xsl:for-each>
      </table>         
   </xsl:template>
   <!--then build your row view-->
   <xsl:template name="Rows.RowView">
      <xsl:variable name="SortValue" select="ddwrt:NameChanged(string(@YourColumnName), 0)"/>
      <xsl:if test="string-length($SortValue) &gt; 0">
         <tr id="group0{generate-id()}">
            <td>
               <xsl:value-of select="@YourColumnName"/>
            </td>
            <td>
                <xsl:value-of select="count(key('YourKeyName', @YourColumnName))"></xsl:value-of>
            </td>
         </tr>
      </xsl:if>
   </xsl:template>