【问题标题】:XSLT Count Distinct in a Group (Data View Web Part)组中不同的 XSLT 计数(数据视图 Web 部件)
【发布时间】:2012-08-22 12:12:44
【问题描述】:

我正在处理 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,因为项目 1 已经为工人 A 计数。

我对 xslt 了解不多,但据我了解,使用 current() 并不是对资源最友好的方法。我试图做 muenchian 分组,但我无法让它工作。不过愿意再试一次。任何建议都会有所帮助,因为我再次对 xslt 感到厌恶。

【问题讨论】:

  • 那么,这个 XML 文档的预期输出应该是什么?请编辑问题并提供此重要信息。您只想要计数(确切地说是什么?)还是想要将所有任务分配给给定用户?
  • 抱歉,这有点含糊。我只需要为每个用户计算不同的项目,即使项目在用户之间重复。我更新了帖子。

标签: sharepoint xslt dataviewwebpart


【解决方案1】:

这种转变

<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 两次:查找所有不同的工作人员,然后查找分配给该工作人员的不同项目。

【讨论】:

  • 我用我的直接 xml 输出尝试了这个,它工作正常。当我尝试将它集成到作为数据视图 Web 部件一部分的现有 xsl 样式表中时,我只为每个用户获得 2 个。我正在尝试在已经存在的模板中选择该计数。我会继续玩它的。
  • @gsmith140,您当前的问题已完全回答。请接受这个答案(点击答案旁边的复选标记)。请在新问题中描述您遇到的任何新问题。
  • 我会接受它作为答案,但我仍然没有有效的解决方案,所以我可能会发布一个后续问题。
  • @gsmith140,不客气。请在发布新问题时通过评论告诉我。
  • @DimitreNovatatchev,快速提问:你为什么同时使用kProjByWorkerkProjWorker 键?不能一键完成按工人计算的独特项目吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-24
  • 2020-09-20
  • 2011-07-11
  • 2017-03-01
  • 2010-10-20
  • 1970-01-01
相关资源
最近更新 更多