65.9K
CodeProject 正在变化。 阅读更多。
Home

MOSS 2007 部门与人员查看器 第 1/2 部分

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.43/5 (5投票s)

2008 年 6 月 24 日

CPOL

10分钟阅读

viewsIcon

56875

downloadIcon

128

以自己的样式(XSLT)显示按部门分组的人员,并且没有结果计数和分页的限制。仅通过深度使用内置的 WebPart。

引言

几周前,我被要求准备一份在不同部门工作但汇总在一个总部门中的员工列表。该列表应位于总部门的 WebPart 页面上。布局在许多方面都与 People Search Core Result (PSCR) 提供的标准布局不同,并且它要克服 PSCR 内置的一些限制。

这些限制是

  • 从 People Search 返回的结果数量限制为每次往返最多 50 条
  • 排序和分组仅是片段式的
  • 当需要对超过 50 条记录的结果集进行分组/排序时,使用 PSCR 将变得不可能
  • PSCR 难以获取某些人员属性

此外,我还有一些其他限制,我认为在较大的、生产性的 MOSS 2007 环境中的许多普通用户都会遇到这些限制。

  • 我无法(或者更准确地说,不允许)部署任何 MOSS 解决方案
  • 我只能使用 MOSS 的内置 WebPart

但幸运的是,我被允许使用 Microsoft Office SharePoint Designer 2007,并且我对 SQL、XML 和 XSLT 有相当的了解!
因此,我将向您展示我多次试错往返的结果以及一些使工作更容易的工具(尤其是 XSLT)。

由于我写这篇文章的空闲时间不多,我将这篇文章分为两部分。

第一部分将指导您如何通过 SharePoint 的 Web 服务获取数据。

第二部分(即将推出)将提供一些增强的 XSLT,用于格式化、分页和分组这些数据。

背景

在多次尝试调整 PSCR 以满足我的需求后,我决定要克服最难的限制——每次往返 50 条记录——的唯一方法是使用一个非常基础但始终可用的 WebPart:WebPartPages:DataFormWebPart。这是一个非常基础的 WebPart,但它的优点是可以自行进行控制。

使用 DataFormWebPart 检索人员信息

DataFormWebPart 可以从各种 <DataSources>. 接收数据。为了接收人员数据,我决定使用 SharePoint 的一个 Web 服务方法。您可以通过访问 http://yoursharepointserver/_vti_bin/search.asmx 来查找搜索方法。我们需要用于获取人员信息的方法是 QueryEx 方法,其参数为 queryXml。

一个有效的参数 XML 看起来是这样的

<QueryPacket xmlns="urn:Microsoft.Search.Query" Revision="1000">
    <Query>
        <Context>
            <QueryText language="en-US" type="MSSQLFT">SELECT PreferredName, Department, Manager, AboutMe,
             Title, Path, Description, Write, Rank, Size  FROM SCOPE() where "scope"='People'
             AND Department LIKE 'MAN DEP 1'</QueryText>
        </Context>
        <Range>
            <StartAt>1</StartAt>
            <Count>1000</Count>
        </Range>
    </Query>
</QueryPacket>
    
QueryPacket 语法的详细描述可以在这里找到
http://msdn.microsoft.com/en-us/library/ms563775.aspx

在此上下文中,最有趣的是 <QueryText> 元素
<QueryText type="MSSQLFT">...</QueryText> 其中 type="MSSQLFT" 表示这是一个“Microsoft SQL Full Text”查询。所以它有点像 SQL,但也有所不同
  • 要检索的列(我示例中的 PrefferedName, Department,...,Size)不是表列,而是 SharePoint 服务器的托管属性(确切地说,是 MOSS 2007 的共享服务提供商的托管属性)。
  • FROM 部分不是一个表,而是(自 MOSS 2007 起)始终是 SCOPE()
  • where 部分由两部分组成
    • 范围限制;因为我们要查找人员,所以必须使用人员范围
      请注意“和”和‘字符的正确使用!我花了一个小时才搞清楚那个模糊的语法。
      对搜索范围的更深入描述将远远超出本文的范围
    • 对属性的限制;在我的示例中,我想将搜索限制在名为“MAN DEP 1”的部门工作的人员。
      不要使用等号 (=)!使用 LIKE,如果您愿意,也可以使用通配符。

<Range> 元素也很有趣:<Start> 决定从哪个位置返回结果;<Count> 给出了返回结果的数量。我最难的限制和做这项工作的动机是“每次往返 50 条记录”的限制;所以这里我们可以绕过这个限制。您可以自行决定将此数字设置得多高;默认值为 100。

查看结果数据

但现在您会产生一些问题

  1. 那么查询会返回什么?
  2. 我在 MSSQLFT 的列部分中获取这些属性的列表?
  3. 以及如何在 SharePoint Designer 中做到这一点?

1) 查询返回 XML(惊讶?- 不,一点也不)。这完全说得通,因为然后我们可以使用 XSLT 来渲染它。

2) 支持您的共享服务提供商 / MOSS 2007 的属性列表可以通过同一个 Web 服务的方法获得:GetSearchMetaData(有关如何在 SharePoint 页面上查看这些信息的详细信息,请参阅 下方)。

3) 是的,这是最“令人沮丧”的部分,因为 IMO SharePoint Designer 对这种工作支持得不是很好!但它确实有效。

  • 在 SharePoint Designer 中打开您想添加搜索的 WebPart 页面(例如在您的 MySite 上)。
  • 选择您想添加搜索的区域(例如,“Full Page”,如果您为您的 WebPart 页面使用了“Full Page”模板;如果您有很多东西要显示,这很有意义)。
  • 在菜单中点击“Insert --> SharePoint-Controlelement --> Dataview”(我希望我正确翻译了这些菜单项;我使用的是德语版)。
  • 在创建的 WebPartPages:DataFormWebPart 中,点击数据源库的链接。这将打开一个面板,显示您实际站点的实际数据源。在该面板中,您应该有一个名为“XML-Webservices”的部分,其中有一个连接到 Web 服务的链接。点击它。
  • 在现在打开的数据源窗口中,键入地址:http://yoursharepointserver/_vti_bin/search.asmx?WSDL(v 和 b 前面有一个下划线,所以是 _vti_bin),然后点击“Connect now”。
  • 现在在下一个列表框中选择“Select”,然后在操作列表框中选择 QueryEx。
  • 在参数列表中,双击 queryXml。
  • 现在输入您的查询的 XML(参见上方)。是的,我知道这是一个糟糕的编辑器,并且您必须在一行中输入所有内容。所以最好先在您选择的编辑器中准备好 queryXml,删除所有换行符,然后复制。但请参阅下方;我将提供一些关于半自动完成此操作的帮助。
  • 在数据源库中,现在应该在 XML Web 服务下有一个名为“QueryService at yoursharepointserver”的新项;点击它上面的上下文菜单,然后选择第一个菜单项“View Data”。
  • 如果您的查询正确并且接收到结果,您应该会看到一个从 soap:Envelope --> soap:Body 开始的树形视图……如果不是,则很可能是您的查询语法有误。
  • 向下滚动并查找 diffgr:diffgram(.NET 程序员会注意到这是一个序列化的 DataSet)。在此之下,您将找到 RelevantResults,然后您可以单击右侧的小箭头来浏览匹配的人员记录。
  • 现在您可以选择所需的字段并将它们拖到您的 DataFormWebPart 中了,但我发现这里的格式化支持非常模糊,我并不喜欢。SharePoint Designer 会在后台构建 XSLT 并将其放入 DataFormWebPart 的 <XSL></XSL> 标签中。因此,如果您有一个 XSLT 编辑器(或 VisualStudio)并且对 XSLT 有一定的了解,那么使用这些工具可能会更容易。如果您有权修改 WebPart 页面上的 WebPart(您通常应该有,因为它属于您自己的网站),您可以直接将 XSLT 复制粘贴到其中的属性中。

因为我通常想先获取数据,然后才关注格式化,所以我将 XSLT 用于任何我想查看查询返回内容的地方(参见文件 ShowAllXML.xslt)。

    <?xml version="1.0" encoding="utf-8"?>D
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
          <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
          <xsl:template match="/">
                <xmp>
                      <xsl:copy-of select="*"/>
                </xmp>
          </xsl:template>
    </xsl:stylesheet>
    

这个 XSLT 只是接收输入的 XML 并将其作为 XML 渲染回来;xsl:copy-of select="*" 获取 XML 中的每个节点并将其返回;周围的 <xmp> 标签告诉浏览器它应该被视为文本(而不是标签,因为那样我们只会看到输入 XML 中非标签的部分)。

在 SharePoint/MOSS 2007 中,XSLT 的使用方式如下

XSLT-processing in MOSS 2007

因此,无论何时在 SharePoint 页面中使用 Web 服务,请使用这个简单的 XSLT 来首先查看您真正获得的数据。另外一个优点是:您可以将显示为 XML 的渲染 HTML 复制到您的 XSLT 工具中,作为测试 XSL 的输入文件。

如果您没有任何 XSLT 工具,您也可以使用 Internet Explorer 内置的 XSLT 处理功能,通过引用 XSLT 文件(在我这里的示例中是 XSLTFileTableView.xslt),IE 将使用该文件来显示您的 XML。

<?xml version="1.0" encoding="utf-8"?>
<!--Referencing the correct XSLT to use-->
<?xml-stylesheet type="text/xsl" href="XSLTFileTableView.xslt"?>
<All_Results>
....Rest of your XML...
</All_Results>

那么,我们现在在哪里?
我们得到了
- 一部分所需的数据(可能不是您想看到的全部属性)
- 一种在 SharePoint Designer 中查看数据的方式
- 一种在我们的 WebPart 页面上将数据渲染为 XML 的方式

还缺少什么
- 可获取的属性列表(MSSQLFT 的“列”)
- 一些真正好的格式化,包括分组和分页

MSSQLFT 的属性

如上所述,Web 服务方法 GetSearchMetaData 提供了关于 QueryEx 方法可用属性的信息。所以只需将另一个 DataFormWebPart 添加到您的搜索页面(或创建一个新页面并将其插入其中),创建一个到您站点的 search.asmx 的新连接,然后使用 GetSearchMetaData 而不是 QueryEx 方法。保存网页,修改 WebPart,并将 ShowAllXML.xslt 的 XSL(参见上方)复制到 WebPart 属性的 XSL 编辑器中。结果将是显示您站点搜索元数据的 XML。每个托管属性都是这些元素之一。

...
<Properties diffgr:id="Properties68" msdata:rowOrder="67" diffgr:hasChanges="inserted">
              <Name>Manager</Name>
              <Description />
              <Type>System.String</Type>
              <Retrievable>true</Retrievable>
              <FullTextQueriable>false</FullTextQueriable>
</Properties>
...

<name> 元素给出了您可以在 QueryEx 的 MSSQLFT 查询中使用的名称。我无法提供完整的属性列表,因为它们是动态的/可配置的,取决于 SharePoint 共享服务提供商。在我我们的环境中,对于要暴露给查询服务的人员属性,需要对其进行索引。因此,如果您在列表中缺少某个属性,很有可能需要请您的 SharePoint 管理员在共享服务提供商的人员导入属性中将该属性设置为“已索引”(您的管理员会知道在哪里找到它 :-))。

属性列表可能非常长,并且可能缺少描述。所以您需要以某种方式过滤它们。因为我讨厌将名称从 XML 复制粘贴到 QueryEx 表达式 XML 中,所以我做了以下事情:

  • 我获取了 SearchMetaData 的完整输出并将其保存到 XML 文件中(参见 PropertiesAndScopes.xml)。
  • 我通过在 <Properties> 标签之前使用 <!-- 和在 </Properties> 标签之后直接使用 --> 来注释掉那些我不想用于 QueryEx 的属性。
  • 然后我使用 XSLT 文件 PropertiesAndScopesToQueryPacket.xslt 在 Visual Studio 2005 中处理 PropertiesAndScopes.xml;输出是一行文本,您可以将其复制粘贴到 SharePoint Designer 中的 QueryEx 表达式编辑器中。如果您想使用 IE,请复制我示例文件的第三行,以便它使用略有不同的 XSLT 进行 IE 处理。
    <?xml-stylesheet type="text/xsl" href="PropertiesAndScopesToQueryPacketIE.xslt"?>

    然后用 IE 打开 XML,并将所有内容复制到剪贴板,然后粘贴到 SharePoint Designer 的 QueryEx 表达式中。

使用此方法时请注意以下几点:

  • 在 PropertiesAndScopesToQueryPacket.xslt 中查找文本:where "scope"='People' AND。在 AND 之后插入您自己的 where 条件;只要您在 select 部分包含了该属性,您就可以在 where 部分使用任何条件(所以您不应该在之前的步骤中注释掉它)。
  • 您需要包含属性 Title, Path, Description, Write, Rank and Size(参见 http://msdn.microsoft.com/en-us/library/ms543175.aspx)。
  • (我提到完整的 QueryPacket 的长度限制约为 5KB。每当我的 QueryPacket 更长时,我就会在 WebPart/SharePointDesigner 中收到错误;我不确定这个限制来自哪里,也没有找到任何关于它的说明。所以请自行尝试。)

这样,您现在应该以 XML 格式获得了所需的,并且 **不** 限制为 50 条记录的人员记录,包含您想要的属性。

本文的第二部分将为您提供一个指南,介绍如何通过 XSLT 来格式化、分组和分页这些结果。敬请期待!

历史

这是本文的第一个版本。

© . All rights reserved.