搜索中心是MOSS默认带的一种新型的站点模版。如果我们创建协作门户站点,也会默认带了一个搜索中心。该类型站点的目的就是替代一般门户中使用的页面顶部的搜索框,为用户提供更加可定制化的搜索体验。
搜索中心是MOSS默认带的一种新型的站点模版。如果我们创建协作门户站点,也会默认带了一个搜索中心。该类型站点的目的就是替代一般门户中使用的页面顶部的搜索框,为用户提供更加可定制化的搜索体验。搜索中心现在有两个版本:简洁型搜索中心和带标签的搜索中心。简洁型搜索中心通常被添加在一个发布功能没有被启用的网站集中。比如一个只有小组协作站点的网站集。带标签的搜索中心通过基于标签(Tabs)的用户界面可以提供完整的定制化支持。但是它要求发布功能必须启用。在协作门户中这是默认的。本文包括两种定制,都是针对带标签的搜索中心而言的。一个是如何添加自定义的搜索页面和标签;另一个是如何替换现有的搜索结果用的XSLT,变成我们的自定义XSLT。
搜索结果页面上有许多WebPart,都是用于搜索结果显示的。其中一个名为搜索核心结果(Search Core Results)的WebPart,该WebPart有很多的属性,用来配置和定制该WebPart。其中最重要的一项,就是我们想要定制的XSLT了。该属性用来将搜索引擎返回的XML搜索结果转换成HTML的形式,并在WebPart的内容区域中展现出来。我们可以用我们自己的XSLT来替换掉它。
用于显示原始XML形式的搜索结果的XSLT用下面的xslt可以使搜索核心结果WebPart显示搜索结果中包含的原始形态的XML,没有应用任何转换。
<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的示例
使用SharePoint Designer,我们可以利用刚刚输出的原始形态的xml来创建一个自定义的xslt。利用SharePoint Designer强大而丰富的xslt设计体验,我们可以为数据视图WebPart生成xslt。用这个生成的xslt就可以替换默认的搜索核心结果WebPart中的xslt。
<xsl:stylesheet version="1.0" exclude-result-prefixes="xsl msxsl ddwrt" xmlns:ddwrt="
http://schemas.microsoft.com/WebParts/v2/DataView/runtime" xmlns:asp=
"http://schemas.microsoft.com/ASPNET/20" xmlns:__designer=
"http://schemas.microsoft.com/WebParts/v2/DataView/designer" xmlns:xsl=
"http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:SharePoint="Microsoft.SharePoint.WebControls" xmlns:ddwrt2=
"urn:frontpage:internal">
<xsl:output method="html" indent="no"/>
<xsl:decimal-format NaN=""/>
<xsl:param name="FileName" />
<xsl:param name="dvt_apos">'</xsl:param>
<xsl:variable name="dvt_1_automode">0</xsl:variable>
<xsl:template match="/"
xmlns:asp="http://schemas.microsoft.com/ASPNET/20" xmlns:__designer=
"http://schemas.microsoft.com/WebParts/v2/DataView/designer" xmlns:SharePoint=
"Microsoft.SharePoint.WebControls">
<xsl:call-template name="dvt_1"/></xsl:template>
<xsl:variable name="dvt_2_automode">0</xsl:variable>
<xsl:variable name="dvt_5_automode">0</xsl:variable>
<xsl:template name="dvt_1">
<xsl:variable name="dvt_StyleName">2ColFrm</xsl:variable>
<xsl:variable name="Rows" select="/All_Results/Result" />
<table border="1" width="100%">
<tr>
<xsl:call-template name="dvt_1.body">
<xsl:with-param name="Rows" select="$Rows" />
</xsl:call-template>
</tr>
</table>
</xsl:template>
<xsl:template name="dvt_1.body">
<xsl:param name="Rows" />
<xsl:for-each select="$Rows">
<xsl:sort select="author" order="ascending" />
<xsl:call-template name="dvt_1.rowview" />
</xsl:for-each>
</xsl:template>
<xsl:template name="dvt_1.rowview">
<td valign="top" width="50%">
<table border="0" cellspacing="0" width="100%">
<tr>
<td width="25%" valign="top" class="ms-vb"><b>title:</b></td>
<td width="75%" class="ms-vb">
<a href="{url}"><xsl:value-of select="title" /></a>
</td>
</tr>
<tr>
<td width="25%" class="ms-vb"><b>author:</b></td>
<td width="75%" class="ms-vb"><xsl:value-of select="author" />
</td>
</tr>
<tr>
<td width="25%" class="ms-vb"><b>write:</b></td>
<td width="75%" class="ms-vb">
<xsl:value-of
select="ddwrt:FormatDate(string(write) ,1033 ,3) />
</td>
</tr>
<xsl:if test="$dvt_1_automode = '1'" ddwrt:cf_ignore="1">
<tr>
<td colspan="99" class="ms-vb">
<span ddwrt:amkeyfield="" ddwrt:amkeyvalue="string($XPath)"
ddwrt:ammode="view" />
</td>
</tr>
</xsl:if>
</table>
</td>
<xsl:if test="position() mod 2 = 0" ddwrt:cf_ignore="1">
<xsl:text disable-output-escaping="yes"></tr></xsl:text>
<xsl:if test="position() != last()" ddwrt:cf_ignore="1">
<xsl:text disable-output-escaping="yes"><tr></xsl:text>
</xsl:if>
</xsl:if>
<xsl:if test="position() = last()" ddwrt:cf_ignore="1">
<xsl:if test="position() mod 2 != 0" ddwrt:cf_ignore="1">
<td>
<xsl:text disable-output-escaping="yes"
ddwrt:nbsp-preserve="yes">&nbsp;</xsl:text>
</td>
</xsl:if>
</xsl:if>
</xsl:template>
</xsl:stylesheet>