联合结果 Web 部件 XSLT

备注

本主题介绍 Infrastructure Update for Microsoft Office Servers包含的功能。若要下载此更新,请参阅 2008 年 7 月 15 日版 SharePoint Server 2007 基础结构更新说明

联合位置的搜索结果将以结构化 XML 格式(例如,RSS 或 Atom)返回到搜索服务器。将根据指定的 XSLT 转换 (XSLT) 来设置结果的格式并在联合搜索 Web 部件中呈现它们。

本主题概述联合位置的默认 XSLT,并介绍如何自定义此 XSLT 以更改结果在联合搜索 Web 部件中的显示方式。

XSLT 简介

XSL 是一种编程语言,它将 XML 转换为另一种格式或结构(例如 HTML)。这意味着,您可以对 XML 文档应用 XSLT 以动态生成 HTML,而不再使用静态 HTML 显示网页。在这种情况下,表示层还会与数据层分离。XSL 提供了许多与传统编程语言相同的功能,例如变量、函数、迭代和条件语句。

有关 XSLT 的详细信息,请参阅以下资源:

XPath 是用来指定要转换 XML 中的哪些元素以及用来计算值的语言。

有关详细信息,请参阅以下资源:

自定义联合位置的 XSLT

在演练用来显示联合搜索结果的特定 XSLT 之前,您应该了解如何查看和修改 XSLT。

您可以在两个位置访问 XSLT:

  • 联合位置的定义

  • 联合 Web 部件属性

选择在哪里修改 XSLT 取决于您是否希望将它全局应用于所有联合搜索 Web 部件,以及希望将结果显示在哪个联合搜索 Web 部件中。

修改联合位置的 XSLT

在联合位置的“显示属性”部分的“XSL”字段中指定联合位置的 XSLT。

备注

您必须是搜索服务管理员才能执行下面的过程。

访问联合位置的“XSL”字段

  1. 在“搜索管理”页上,单击“联合位置”。

  2. 在“管理联合位置”页上,单击要修改的位置的“位置显示名称”。

  3. 在“显示信息”部分中,取消选中要更改其 XSLT 的联合搜索 Web 部件部分的“使用默认格式”。

  4. 单击“XSL”字段的省略号按钮 (…)。这会打开位置的 Xsl 元素的“文本输入”窗口。您可以在此窗口中直接修改 XSLT;但将代码复制到文件中可能更为简单。然后,您可以使用应用程序(例如 Microsoft Visual Studio 2008)来编辑该文件。编辑完该文件后,可以将修改后的代码复制到“文本输入”窗口中。

  5. 单击“确定”保存您所做的更改,关闭“文本输入”窗口,然后单击“确定”更新位置。

    您可以通过选中步骤 3 中指定的“使用默认格式”复选框,撤消对 XSLT 所做的更改并还原回为该位置指定的默认 XSLT。

备注

您也可以在位置定义 (.fld) 文件中直接访问位置的 XSLT。XSLT 在 Xsl 元素中指定,该元素包含在位置定义架构Visualization 元素内。

当您希望将自定义 XSLT 全局应用于配置为使用特定位置的全部或大部分联合 Web 部件时,应该选用此方法。这是因为当您修改联合位置的 Xsl 元素时,除非自定义了单个 Web 部件的 XSL 属性,否则自定义 XSLT 将用于配置为使用该位置的所有联合搜索 Web 部件。我们还建议您在将 XSLT 自定义为在顶部联合结果 Web 部件中显示结果时使用此方法。这是因为您可以为此 Web 部件指定多个位置,每个位置的自定义 XSLT 可能会有所不同。

修改联合 Web 部件的 XSLT

可以在 Web 部件的工具窗格中的“显示属性”部分的 Xsl 属性中指定联合搜索 Web 部件的 XSLT。正如上一节中提到的,我们建议您只对联合结果 Web 部件使用此方法。

访问联合结果 Web 部件的 XSL 属性

  1. 在浏览器中,导航到结果页 URL。例如:

    http://<ServerName>/results.aspx
    
  2. 单击“网站操作”链接,然后单击“编辑网页”。

  3. 对于要修改的联合结果 Web 部件实例,单击“编辑”箭头以显示“Web 部件”菜单,然后单击“修改共享 Web 部件”。这会打开联合结果 Web 部件工具窗格。

  4. 单击“显示属性”箭头。

  5. 清除“使用位置可视化”,然后单击“XSL 编辑器”。

    这会打开 Web 部件的 XSL 属性的“文本输入”窗口。您可以在此窗口中直接修改 XSLT;但将代码复制到文件中可能更为简单。然后,您可以使用应用程序(例如 Visual Studio 2008)来编辑该文件。编辑完该文件后,可以将修改后的代码复制回“文本输入”窗口中。

  6. 单击“保存”关闭“文本输入”窗口,然后单击“确定”更新联合结果 Web 部件实例。

    您可以通过选中步骤 6 中指定的“使用位置可视化”复选框,撤消对 XSLT 所做的更改并还原回为该位置指定的默认 XSLT。

您现在可以检查用来显示联合搜索结果的 XSLT 了。

联合 Web 部件的 XSLT

Microsoft Office SharePoint Server 2007 企业级搜索支持两种类型的联合位置:

本地搜索索引   搜索服务器的本地 SharePoint 网站。

OpenSearch 1.0/1 任何远程搜索服务器的结果页的 RSS 源,或支持 OpenSearch 标准并返回结构化 XML 格式的搜索结果(例如,RSS 或 Atom 结果)的任何可搜索源。

当两种位置类型的结果显示在联合搜索 Web 部件中时,它们看起来格式相同。但为每种位置类型返回的 XML 数据存在差异,这意味着为每种位置类型指定的默认 XSLT 也存在差异。本节概述两种位置类型的结果 XML 和用于转换它的 XSLT。

本地搜索索引位置

使用本地搜索索引位置类型可显示来自此搜索服务器上的本地搜索索引的联合结果。在开始修改应用于此位置类型的结果 XML 之前,您应该了解本地搜索索引位置类型的结果 XML 数据的内容。您可以使用自定义版本的 XSLT 查看此位置类型的结果原始 XML 数据。如何:查看联合位置返回的 XML 数据中介绍了此任务的自定义 XSLT 和修改此 XSLT 的方法。

本地搜索索引结果 XML 数据

下面的代码示例演示本地搜索索引位置的联合结果 XML 数据的一部分。

<All_Results>
  <Result>
    <id>1</id>
    <title>Local Site</title>
    <hithighlightedsummary>
  Get Started with Windows <c0>SharePoint</c0> Services!
    </hithighlightedsummary>
    <hithighlightedproperties>
      <HHTitle>My Local Site</HHTitle>
      <HHUrl>http://MyLocalSite</HHUrl>
    </hithighlightedproperties>
    <url>http://MyLocalSite</url>
    <urlEncoded>http%3A%2F%2FMyLocalSite</urlEncoded>
    <description>This is a local site.</description>
    <contentclass>STS_Site</contentclass>
    <imageurl imageurldescription="Result of type:document">
  /_layouts/images/STS_Site16.gif
    </imageurl>
  </Result>
…
</All_Results>

如果您熟悉为核心搜索结果 Web 部件返回的 XML 数据,则会注意到本地搜索索引位置类型的结果 XML 数据与之非常相似,并且二者的某些 XSLT 自定义也相似,尤其是搜索词突出显示元素的自定义,这些元素包括:

  • hithighlightedsummary

  • hithighlightedproperties

  • HHTitle

  • HHUrl

有关自定义核心搜索结果 XSLT 的详细信息,请参阅企业级搜索核心结果 XSLT 转换Chapter 3: Customizing and Extending the Microsoft Office SharePoint 2007 Search (Part 1 of 2)

另一个相似之处是顶级(根)节点与 XSL 模板的关联方式,转换即是从 XSL 模板开始的。下面是有关这一点的本地搜索索引位置的 XSLT:

<xsl:template match="/">  
           <xsl:call-template name="MainTemplate"/>
</xsl:template>

在 OpenSearch 位置的 XSLT 中,根据返回的位置结果所采用的 XML 格式,将根元素与模板相关联。有关这一点的详细信息,请参阅本主题后面的“模板”一节。这是因为 OpenSearch 结果有多种 XML 格式,所以 XSLT 必须包括针对不同格式的不同处理指令。由于返回的本地搜索索引结果始终采用相同的 XML 格式,因此 XSLT 只需要包括一种 XML 格式的处理指令。

但是,除了此处指出的差异外,这两种位置类型的 XSLT 很相似,因此下一节中为 OpenSearch 位置提供的大多数信息也适用于本地搜索索引位置的 XSLT。

OpenSearch 位置

使用 OpenSearch 位置类型可显示来自远程搜索服务器上的搜索索引 RSS 源的联合结果。使用它也可显示来自支持结构化 XML 格式(例如 RSS 或 Atom)返回结果的网站的联合结果。

OpenSearch 结果 XML 数据

如前面所述,了解结果 XML 数据的内容很有用。您可以使用自定义版本的 XSLT 查看来自 OpenSearch 位置的结果的原始 XML 数据。如何:查看联合位置返回的 XML 数据中介绍了此任务的自定义 XSLT 和修改此 XSLT 的方法。

下面的代码示例演示远程搜索索引位置的 RSS 源联合结果 XML 数据的一部分。

RSS 源结果 XML 数据

<rss version="2.0" xmlns:srrt="https://schemas.microsoft.com/WebParts/v3/srchrss/runtime">
  <channel>
    <title>Search Results: sharepoint</title>
    <link>
  http://MyRemoteSite/pages/results.aspx?k=sharepoint
    </link>
    <description>
  Search RSS feed for Microsoft Office SharePoint Server 2007
    </description>
    <language>en-US</language>
    <lastBuildDate>
  Mon, 28 Jan 2008 10:42:03 GMT
    </lastBuildDate>
    <generator>
  Microsoft Office SharePoint Server 2007 RSS Generator
    </generator>
    <ttl>60</ttl>
    <image>
      <title>Search Results: sharepoint</title>
      <url>
  http://MyRemoteSite/pages/_layouts/images/homepage.gif
      </url>
      <link>
  http://MyRemoteSite/pages/results.aspx?k=sharepoint
      </link>
    </image>
    <item>
      <title>
  Get Started with Windows SharePoint Services!
      </title>
      <link>
  http://MyRemoteSite/Lists/Announcements/DispForm.aspx?ID=1
      </link>
      <description>
<div style="margin-top:5px">
<link rel="stylesheet"type="text/css" href="http://MyRemoteSite/_layouts/1033/styles/portal.css" />
<span class="srch-Icon">
<a href="http://MyRemoteSite/Lists/Announcements/DispForm.aspx?ID=1" title="Get Started with Windows SharePoint Services!">
<img src="http://MyRemoteSite/_layouts/images/STS_ListItem16.gif" alt="Result of type: document" border="0" /></a></span>
<span class="psrch-Description">
Get Started with Windows <b>SharePoint</b> Services!
…

Windows <b>SharePoint</b> Services helps you to be more effective by connecting people, information
…
</span>
<p class="srch-Metadata">
<span class="srch-URL">
<a href="http://MyRemoteSite/Lists/Announcements/DispForm.aspx?ID=1" title="Get Started with Windows SharePoint Services!">
http://MyRemoteSite/Lists/Announcements/DispForm.aspx=ID=1
</a></span></p></div>
      </description>
      <author>Denise Smith</author>
      <pubDate>1/28/2008</pubDate>
    </item>
    <item>
    …
    </item>
    …
  </channel>
</rss>

对 XSLT 进行修改之前,请先熟悉结果 XML 数据。了解所转换内容的结构后,就可以更轻松地进行更改。

配置参数

第一个 XSLT 块用来定义可能会在运行时传递给转换的各种配置参数。

<xsl:param name="ResultsPerPage">3</xsl:param>
<xsl:param name="IsDesignMode">True</xsl:param>
<xsl:param name="UrlMaxLength">50</xsl:param>
<xsl:param name="SummaryMaxLength">300</xsl:param>
<xsl:param name="ShowMoreLink">true</xsl:param>
<xsl:param name="MoreLink"></xsl:param>
<xsl:param name="MoreLinkLabel"></xsl:param>
<xsl:param name="IdPrefix"></xsl:param>
<xsl:param name="WebpartTitle"></xsl:param>
<xsl:param name="DefaultIconDescription"></xsl:param>
<xsl:param name="BrandingIcon"></xsl:param>
<xsl:param name="IsFirstPage">true</xsl:param>

有关 XSLT 中参数的详细信息,请参阅 <xsl:param> Element。作为可设置的自定义示例,您可以指定要作为品牌图像显示在 Web 部件标题栏中的图像的链接。为此,请修改 BrandingIcon 参数,如下所示。

<xsl:param name="BrandingIcon">http://MyRemoteServer/_layouts/images/customBrandingImage.gif</xsl:param>

有关更改标题栏中显示的内容的详细信息,请参阅如何:自定义联合搜索结果的标题和商标图标

模板

现在检查顶级(根)XML 元素与 XSL 模板相关联的代码部分。(有关 XSL 模板的详细信息,请参阅 xsl:template element。)

结果 XML 数据的根元素基于返回的位置结果所采用的 XML 格式。在 RSS 源结果 XML 数据示例中,格式为 RSS,因此顶级元素为 <rss>。

下面是默认 XSLT 的一个代码块,其中,根据 xsl:template 元素的 match 属性中指定的格式,根元素与模板相关联。

<xsl:template match="rss">
  <xsl:call-template name="MainTemplate">
    <xsl:with-param name="Type" select="'rss'"/>
  </xsl:call-template>
</xsl:template>
<xsl:template match="rdf:RDF">
  <xsl:call-template name="MainTemplate">
    <xsl:with-param name="Type" select="'rdf'"/>
  </xsl:call-template>
</xsl:template>
<xsl:template match="atom:feed">
  <xsl:call-template name="MainTemplate">
    <xsl:with-param name="Type" select="'atom'"/>
  </xsl:call-template>
</xsl:template>
<xsl:template match="atom2:feed">
  <xsl:call-template name="MainTemplate">
    <xsl:with-param name="Type" select="'atom2'"/>
  </xsl:call-template>
</xsl:template>

当根元素与 match 属性中指定的值相匹配时,将应用 xsl:call-template element中指定的模板。在此示例中,同一模板 MainTemplate 与所有格式相关联;但对于每种格式,使用 xsl:with-param element为传递给 MainTemplate 的 Type 参数指定的值各不相同。

MainTemplate

您可以通过搜索下面的 XSLT 片段来查找 MainTemplate 模板。

<xsl:template name="MainTemplate"

查看 MainTemplate 中的 XSLT,您可以看到它包括下面的处理指令:

  • 使用 xls:variable elements设置以下变量:

    • “Rows”,包含结果的集合。

    • “RowCount”,包含使用 count function计算出的结果数量。

    • “ChannelTitle”,包含使用 xsl:value-of element从 XML 中检索到的联合位置的标题。由于包含联合位置的标题的 XML 节点基于格式类型,因此会结合使用 xsl:choose elementxsl:when element来按条件选择节点名称,并将 Type 参数值传递给 MainTemplate。

  • 检查是否有任何结果。此步骤只包括在顶级联合结果 Web 部件中,因为此 Web 部件只显示在结果的第一页上。

  • 检索 XML 数据中指定的联合位置的标题,并将其设置为名为 ChannelTitle 的变量。

  • 使用 xsl:if element检查是否至少返回了一行结果,如果是,则:

    • 指定 HTML 来显示联合 Web 部件的标题栏的数据,包括标题和品牌图像。此处使用 xsl:call-template 元素中指定的 GetBrandingImage 模板检索品牌图像。GetBrandingImage 模板只验证是否为 BrandingIcon 参数指定了值,如果指定了值,则返回该值。

    • 调用 MainTemplate.body 模板,传入几个参数,包括 Rows、RowCount 和 Type 参数。下一节将提供有关 MainTemplate.body 的详细信息。

    • 调用 MoreLinkTemplate 模板,该模板指定 HTML 来显示“更多结果”链接。

MainTemplate.body

此模板中的 XSLT 循环访问每个结果,并执行以下操作:

  • 调用各种模板来检索结果的标题、链接和图像 XML 数据。您可以在 GetItemIcon 模板中自定义为结果显示的图像。

  • 指定 HTML 来显示标题、链接和图像。在此处为标题调用 GetSafeHtml 模板,以确保没有使用不安全的 HTML。

  • 调用 MainTemplate.description,下一节将对此进行介绍。

MainTemplate.description

此模板中的 XSLT 设置结果的说明 XML 的格式,并指定 HTML 来显示此 XML。它包括以下处理指令:

  • 调用 GetDescription 模板来检索结果的说明 XML。

  • 验证结果是否包含有关说明的值,如果包含,则:

    • 调用 GetPlainTextFromHtml 模板,以从说明中删除任何 XML。若要在说明中返回 HTML,可以自定义 XSLT 以删除此步骤。

    • 调用 TrimIfGreaterThanMax 模板以将说明中的字符数减少到限制的字符数(如果指定了字符数限制)。

    • 指定 HTML 来显示说明。您可以自定义在模板的这一部分中显示说明的方式。

自定义 XSLT

在以下几种情况下,您可能需要自定义 XSLT:

  • 需要通过修改默认 XSLT 中的现有模板,对联合搜索结果的显示做出较小更改。

  • 需要通过向 XSLT 中添加新模板,对联合搜索结果的显示做出更复杂的更改。

  • 需要修改 XSLT 以显示添加到联合搜索结果中返回的一组默认属性中的属性。

  • 需要根据返回的属性值之一,对某些联合结果的显示按条件做出更改。

  • 需要修改显示模板以使用自定义级联样式表类替换默认级联样式表类。

下面的主题指导您如何修改各种自定义方案的联合结果 XSLT:

See Also

概念

联合搜索概述