XSLT计数在组中不同(数据视图Web部件)

时间:2012-08-22 12:12:45

标签: sharepoint xslt dataviewwebpart

我正在开发SP 2010中的数据视图Web部件,以便从子站点获取一些信息。这些站点包含将任务分配给用户的项目任务列表。客户希望看到汇总,该汇总将根据用户是否分配了任务来列出项目。由于项目可以有多个任务,因此项目可以在汇总中显示在多个用户下,具体取决于为哪些用户分配了哪些任务。

长话短说,我需要一种方法来为每个用户选择不同项目的数量

xml结构如下:

<Rows>
  <Row Project="Project 1" TaskID="1" AssignedTo="Worker A" />
  <Row Project="Project 1" TaskID="2" AssignedTo="Worker B" />
</Rows>

从这一点来看,我希望项目有以下几点: 工人A:1
工人B:1

我正在尝试以下公式:

count($nodeset[not(@Project=preceding-sibling::Row/@Project) and @AssignedTo = current()/@AssignedTo])

这将返回工人A的1个项目的计数,但它对工人B返回0,因为工程A已经计算了项目1。

我对xslt了解不多,但据我所知,使用current()并不是最有利于资源的方法。我曾尝试过muenchian分组,但我无法让它工作。愿意再试一次。任何建议都会有所帮助,因为我再次使用xslt。

1 个答案:

答案 0 :(得分:0)

此转化

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:key name="kWorker" match="@AssignedTo" use="."/>
 <xsl:key name="kProjByWorker" match="@Project" use="../@AssignedTo"/>
 <xsl:key name="kProjWorker" match="@Project" use="concat(.,'+',../@AssignedTo)"/>

 <xsl:template match="/*">
  <xsl:apply-templates select=
  "//@AssignedTo
     [generate-id()
     =
      generate-id(key('kWorker',.)[1])
      ]"/>
 </xsl:template>

 <xsl:template match="@AssignedTo">
  <xsl:value-of select="concat('&#xA;',.,': ')"/>

  <xsl:value-of select=
   "count(
     key('kProjByWorker', .)
       [generate-id()
       =
        generate-id(key('kProjWorker', concat(.,'+',current()))[1])]
     )"/>
 </xsl:template>
</xsl:stylesheet>

应用于以下XML文档(提供的更具挑战性的版本):

<Rows>
  <Row Project="Project 1" TaskID="1" AssignedTo="Worker A" />
  <Row Project="Project 1" TaskID="2" AssignedTo="Worker B" />
  <Row Project="Project 1" TaskID="2" AssignedTo="Worker A" />
  <Row Project="Project 2" TaskID="1" AssignedTo="Worker A" />
</Rows>

生成想要的正确结果

Worker A: 2
Worker B: 1

<强>解释

使用 Muenchian grouping method 两次:查找所有不同的工作人员,然后查找分配给此工作人员的不同项目。