企业级搜索核心结果 XSLT 转换

通过修改搜索核心结果 Web 部件 XSLT 转换 (XSLT),可以更改搜索结果在搜索结果页上的显示方式。本主题介绍搜索核心结果 Web 部件 XSLT 及其自定义方法。

关于修改此代码在何种情况下有实用价值,以下几个应用场景给出了示例:

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

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

  • 要根据所返回的属性值之一,对某些结果的显示有条件地做出更改。

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

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

修改搜索核心结果 Web 部件 XSLT

搜索核心结果 Web 部件 XSLT 在该 Web 部件的“XSL” 属性中指定。可以从搜索核心结果 Web 部件工具窗格的数据表单 Web 部件的工具部件中查看和修改此属性。有关如何查看和修改此属性的详细信息,请参阅如何:查看和编辑搜索结果 XSLT 转换

查看搜索结果 XML 数据

修改搜索核心结果 Web 部件的 XSLT 之前,了解结果 XML 数据包含的内容会很有帮助。

以下代码示例是一段搜索结果 XML 数据。

备注

要查看这些数据,请按照如何:查看搜索结果 XML 数据中所述的步骤操作。

<All_Results>
  <Result>
    <id>1</id> 
    <rank>713</rank> 
    <title>Microsoft.SharePoint Namespace</title> 
    <author /> 
    <size>39058</size> 
    <url>https://msdn.microsoft.com/library/default.asp?url=/library/en-     us/spptsdk/html/tsnsMicrosoftSharePoint_SV01017995.asp</url> 
    <description>Microsoft.SharePoint Namespace</description> 
    <sitename> https://msdn.microsoft.com/library</sitename> 
    <collapsingstatus>0</collapsingstatus>
    <hithighlightedsummary>
      <…>
    </hithighlightedsummary>
    <hithighlightedproperties>
      <…>
    </hithighlightedproperties>
    <…>
   </Result>
   <Result>
    <…>
    <…>
   </Result>
</All_Results>  

搜索结果 XML 数据所含元素由以下因素决定:

  • 搜索核心结果 Web 部件的显示属性。

  • “结果查询选项 - 选定的列”设置中指定的托管属性。

备注

有关如何更改搜索结果中所含托管属性的详细信息,请参阅如何:更改核心搜索结果中返回的属性

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

使用 XSL 模板

本部分介绍在搜索核心结果 XSLT 中定义和使用的模板。

根模板

开始查看搜索核心结果 XSLT 之前,请检查代码中启动转换的部分。此部分位于代码的末尾;可以通过搜索以下标记将其找到:

<xsl:template match="/">

以下语法定义一个模板,并将其与 XML 的根节点相关联:

<All_Results>
…
</All_Results>

此模板的完整 XSLT 如下:

  <xsl:template match="/">
    <xsl:variable name="Rows" select="/All_Results/Result" />
    <xsl:variable name="RowCount" select="count($Rows)" />
    <xsl:variable name="IsEmpty" select="$RowCount = 0" />
    <xsl:if test="$AlertMeLink">
      <input type="hidden" name="P_Query" />
      <input type="hidden" name="P_LastNotificationTime" />
    </xsl:if>
    <xsl:choose>
      <xsl:when test="$IsNoKeyword = 'True'" >
        <xsl:call-template name="dvt_1.noKeyword" />
      </xsl:when>
      <xsl:when test="$IsEmpty">
        <xsl:call-template name="dvt_1.empty" />
      </xsl:when>
      <xsl:otherwise>
        <xsl:call-template name="dvt_1.body"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

根模板不转换任何结果 XML 数据。其主要功能是根据针对搜索结果 XML 数据的条件测试,确定接下来应该应用哪个模板。

XSLT 中的条件测试尝试确定以下哪个搜索结果 Web 部件应用场景适用:

  • 搜索核心结果 Web 部件包含搜索结果。

  • 搜索核心结果 Web 部件不含搜索结果,因为以下情况之一属实:

    • 未发出任何搜索查询。

    • 对搜索查询未返回任何相关结果。

无搜索结果模板

XSLT 首先测试以下条件:

  • 是否存在搜索查询?

  • 搜索结果集是否为空?

如果没有指定任何搜索词直接导航到结果页,或已将 Web 部件配置为使用固定关键词查询但未指定任何关键词,则第一个条件将返回 true。如果该条件返回 true,则对搜索核心结果 Web 部件主体所应用的 XSL 模板为 dvt_1.noKeyword 模板。下图显示此模板在结果页中的显示方式:

dvt_1.noKeyword XSL 模板

若要修改外观,请在搜索核心结果 Web 部件 XSLT 中搜索此模板的开始标记:

<xsl:template name="dvt_1.noKeyword">

然后修改内容。

如果用户输入的搜索查询未返回任何结果,则第二个条件返回 true。对本示例而言,应用于搜索核心结果 Web 部件主体的模板为 dvt_1.empty 模板。下图显示此模板在结果页中的显示方式:

dvt_1.empty XSL 模板

若要修改所显示的文本或操作链接,请在 XSLT 中搜索此模板的开始标记:

<xsl:template name="dvt_1.empty">

然后修改内容。

搜索结果模板

如果前述条件都未返回 true,则将返回搜索结果,进而将对搜索核心结果 Web 部件的主体应用此模板 XSLT 的 <xsl:otherwise> 标记中指定的模板。

若要查看此模板的 XSLT,请搜索代码中的以下内容:

<xls:template name="dvt_1.body">

此模板中的转换代码主要用于随搜索结果一起显示的页眉;对页眉做任何所需更改都要修改此模板。下图显示默认页眉:

dvt_1.body XSL 模板

在此模板代码末尾的搜索结果页眉转换代码之后,将发现下面一行 XSLT 代码:

<xsl:apply-templates />

此行代码表示应该继续 XSL 转换,并对发现匹配项的子节点应用模板。如果检查 dvt_1.body 模板的结束标记,就会看到下一行 XSLT 为以下内容:

<xsl:template match="Result">

此代码定义模板与“结果”节点相关联,并包含用于生成搜索结果显示的 XSLT,显示中对每个结果都加入以下元素:

  • 图标/图像

  • 标题

  • 说明

  • 元数据

搜索结果元数据的默认 XSLT 包括 Path、Size、Author 和 LastModified 属性的值。

在这些部分中会注意到 XSLT 调用了其他模板。接下来的部分详细介绍这些模板。

HitHighlighting 模板

HitHighlighting 模板负责将以下结果部分中显示的搜索词突出显示:

  • 标题

  • URL

  • 说明

若要了解此 XSLT 的工作原理,必须查看搜索结果 XML 数据的 <Result></Result> 标记中与 hithighlighting 相关的子元素。在下面的示例中,用户输入的搜索词为“SharePoint”、“Namespace”和“Class”:

<hithighlightedsummary>
  <c0>SharePoint</c0> <c1>namespace</c1> provides types and members that can be used for working with a <c0>SharePoint</c0> site  <ddd /> a top-level <c2>class</c2> that represents a <c0>SharePoint</c0> site and provides access to its collection of subsites <ddd /> <c0>SharePoint</c0> <c1>namespace</c1> and a brief description of each.
</hithighlightedsummary>
<hithighlightedproperties>
  <HHTitle>Microsoft.<c0>SharePoint</c0> <c1>Namespace</c1></HHTitle>
  <HHUrl>https://msdn.microsoft.com/library/default.asp?url=/library/en-     us/spptsdk/html/tsnsMicrosoft<c0>SharePoint</c0>_SV01017995.asp</HHUrl>
</hithighlightedproperties>

元素 <hithighlightedsummary></hithighlightedsummary>、<HHtitle></HHtitle> 和 <HHUrl></HHUrl> 在其 XML 数据中都嵌入了子元素,这些子元素为 XML 数据中找到的每个搜索词充当包装。

存在多个搜索词时,每个词包含在不同元素中;但对同一搜索词的不同实例都使用同一个元素。

如上例中所示,<c0></c0> 标记包含第一个搜索词,<c1></c1> 元素包含第二个搜索词,以此类推。

可以修改 HitHighlighting 模板来自定义在结果中突出显示搜索词的方式。例如,可以更改突出显示的文本的颜色,并使用不同颜色代表不同搜索词。

下面的 XSLT 代码示例演示如何做到这一点:

<xsl:template match="c0">
    <b style="color: #ff0033">
      <xsl:value-of select="."/>
    </b>
  </xsl:template>
  <xsl:template match="c1">
    <b style="color: #990066">
      <xsl:value-of select="."/>
    </b>
</xsl:template>

示例的突出显示部分标出了加入默认 XSLT 代码以更改突出显示搜索词所用颜色的代码。这段代码可以在 HitHighlighting 模板中找到。要找到此模板,请在 XSLT 中搜索:

<xsl:template name="Hithightlighting">

DisplaySize 模板

DisplaySize 模板负责显示结果中返回的 Size 属性。此模板的 XSLT 计算最适合使用的单位(从字节、KB 或 MB 中选择),并相应调整所显示的大小值。

DisplayString 模板

DisplayString 模板是用于显示结果 XML 数据中所返回字符串值的通用模板。默认 XSLT 使用此模板显示 Author 和 LastModified 属性。

See Also

任务

如何:查看和编辑搜索结果 XSLT 转换

如何:更改核心搜索结果中返回的属性

如何:查看搜索结果 XML 数据

如何:更改核心搜索结果中返回的属性

概念

自定义企业级搜索结果