XSLTVisual Basic 9 (2008)DBAVisual Studio 2008设计/图形架构师.NET 3.5Ajax初学者中级开发Visual Studio.NETVisual BasicASP.NET
使用 Windows Live Search 搜索您的网站(第 II 部分)






4.20/5 (4投票s)
我原创文章的更新,允许您使用 Windows Live Search 搜索您的个人网站。

引言
本文是我原创文章 使用 MSN Site Search 搜索您的网站 的后续。我注意到这篇文章仍然受到一些关注,所以我决定整理一个更新的版本。
此版本中的更改
- 代码已更新为 Visual Studio 2008
- 代码重构,以获得更好的封装和性能
- 启用了 AJAX.NET 支持。演示现在已启用 Ajax
- 更新了已弃用的
xml.xsl
转换调用 - 修复了一些分页错误
- 在源失败时添加一次重试
- 更新名称为 Windows Live。
- 改进了一般的显示输出
背景
在上面的示例中,我正在使用 Web 表单中键入的搜索字符串动态构建查询字符串。 然后我用 XSL 样式表解析 RSS 源并显示结果。 分页是通过将参数传递给 XSL 文件并在 XSL 中处理分页来实现的。 要查看此示例,请单击上面的链接。
Using the Code
正如您所看到的,搜索效果很好并且速度非常快。您可以尝试搜索我的网站,例如“ASP”或“XML”,以生成足够的搜索结果。
我正在提供我的代码供下载。 请随意下载并在您的网站上使用它。 它可以在任何运行 ASP.NET 的服务器上运行。 您只需更改两个变量即可个性化您网站中的搜索结果。 在 ASPX 文件中,您会找到两个变量 sitename
和 resultcount
。 sitename
是您网站的完全限定域名,resultcount
指定要返回的结果总数。 您可能需要根据您拥有的内容量来调整此值。 每次查询下载的总结果越少,运行速度就越快。
.NET 代码
Sub DisplaySearchResults()
'check if user entered a search term.
If term.Text <> "" Then
Try
'init
Dim msnXmlSrc As String = MSNSearchURL & sitename & "+_
" & searchterm & "&format=rss&FORM=ZZRE&count=_
" & resultcount & "&first=" & start
Dim msnXslFile As String = Server.MapPath(XslTranformFile)
'load output into xml document.
Dim msnXmlDoc As XmlDocument = New XmlDocument()
msnXmlDoc.Load(msnXmlSrc)
'set parameters.
Dim arglist As XsltArgumentList = New XsltArgumentList()
arglist.AddParam("top", "", top)
arglist.AddParam("page", "", pagenum)
arglist.AddParam("searchterm", "", searchterm)
'Transform xml/xsl
Dim out As HtmlGenericControl = _
TransformXml(msnXmlDoc, msnXslFile, arglist)
'add control to placeholder
If ResultPLC.Controls.Count > 0 Then ResultPLC.Controls.RemoveAt(0)
ResultPLC.Controls.Add(out)
Catch ex As Exception
Try
'retry once
If failcount > 0 Then Throw New Exception(ex.Message)
failcount = failcount + 1
DisplaySearchResults()
Catch ex2 As Exception
'message error
Dim litOut As New Literal
litOut.Text = ex2.Message()
ResultPLC.Controls.Add(litOut)
End Try
End Try
Else
Dim litOut As New Literal
litOut.Text = "Please enter a search term."
ResultPLC.Controls.Add(litOut)
End If
End Sub
Public Function TransformXml(ByVal xmldoc As XmlDocument, ByVal stylesheet As String, _
ByVal params As XsltArgumentList) As System.Web.UI.HtmlControls.HtmlGenericControl
'init
Dim m_TransformXml As New System.Web.UI.HtmlControls.HtmlGenericControl
Dim sw As StringWriter = New StringWriter()
Dim xslDoc As New XslCompiledTransform()
Try
'perform transformation
xslDoc.Load(stylesheet)
xslDoc.Transform(xmldoc, params, sw)
Catch ex As Exception
'bubble exception
Throw New Exception(ex.Message())
Finally
'free memory
sw.Dispose()
xslDoc = Nothing
End Try
'return control
m_TransformXml.InnerHtml = sw.ToString()
sw.Dispose()
Return m_TransformXml
End Function
XSLT 转换文件
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" />
<xsl:param name="top" />
<xsl:param name="page" />
<xsl:param name="searchterm" />
<xsl:template match="/">
You searched for "<xsl:value-of select="$searchterm" />"<br />
<hr />
<xsl:for-each select="rss/channel/item">
<xsl:if test="position() < ($top*($page+1)) + 1 and position() > $page * $top">
<a href = "{link}">
<span class="style1">
<strong>
<xsl:value-of select="title" />
</strong>
</span>
</a>
<br />
<span class="style1">
<xsl:value-of disable-output-escaping="no"
select="translate(substring(description,1,150),'/',' /')" />
<xsl:value-of disable-output-escaping="no" select="' ...'" />
</span>
<br />
<xsl:value-of select="link" />
<br />
<br />
</xsl:if>
<xsl:if test = "position()=last()">
<hr />
<div>
<div class="paginate">
<xsl:if test = "($page = 0) and ($top<last()-1)">
<a href = "javascript:javascript:__doPostBack
('LbHoldClick','{$page+1}');">next >
关注点
尽管 Microsoft 可能难以跟踪其源的使用位置,但 RSS 文件中的许可信息明确声明结果不得用于商业目的。 据我所知,Google API 对所有用户都是免费的,每天最多可进行 1,000 次搜索。 因此,如果您要构建商业网站,我建议您使用 Google 搜索 API,但如果您只是想在您的个人网站上实现一个出色的快速搜索,那么 MSN 网站搜索是一个不错的选择。 如果您决定在您的网站上使用此脚本,请发布一个链接,以便我可以看一看。