用ASP.NET建立一个在线RSS新闻聚合器(4)

2008-02-22 09:27:52来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

  每当 DisplayNewsItems.aspx 页面装载的时候,这段客户端 JavaScript 代码会在右下角的框架中显示一个空白页。为了理解为什么要加入这段代码,我们来看看省略这段代码,我们会碰到什么情况:
  ·用户在左边的框架中点击聚合摘要,浏览器会在右上部的框架中装载摘要新闻项;
  ·用户在右上部框架中点击某个新闻项,浏览器会在右下部框架中装载这个新闻项 的详细内容;
  现在用户在左边的框架中点击其它的聚合摘要,浏览器会在右上部分的框架中装载新的摘要新闻项;
  前一个新闻项的详细内容还显示在右下部的框架中!通过上面的客户端 Javascript 代码,每次点击左面框架的摘要便可以清除右下部框架 的内容,以消除这一瑕疵。
  在我们处理了客户端代码的问题之后,让我们把注意力转到添加 XML Web 控件。一旦加入 XML Web 控件,将其 ID 属性设置为 xsltNewsItems,TransformSourc 属性设置为 NewsItems.xslt(我们将要创建的 XSLT 样式表文件的名称)。现在,在 Page_Load 事件处理函数中,我们需要 在某个 XmlDocument 实例中获取远程 RSS 聚合文件,然后将该 XML Web 控件的 Document 属性赋给该 XmlDocument 实例。
  在 Page_Load 事件处理函数中,与我们要实现的任务有密切关系的代码是最后三行代码。这三行代码创建一个新的 XmlDocument 对象, 加载远程 RSS 摘要内容,然后将这个 XmlDocument 对象赋给 XML Web 控件的 Document 属性。访问远程 XML 数据并 将它们显示在 ASP.NET 页面中就是这么简单,难道给你留下的印象不深吗?
  剩下我们要做的一件事就是创建 XSLT 样式表,NewsItems.aspx。下面是样式表的第一版的草稿:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" omit-xml-declaration="yes" />
<xsl:template match="/rss/channel">
<b><xsl:value-of select="title"
disable-output-escaping="yes" /></b>
<xsl:for-each select="item">
<li>
<a>
<xsl:attribute name="href">
DisplayItem.aspx?ID=<xsl:number value="position()" />
</xsl:attribute>
<xsl:attribute name="target">rbottom</xsl:attribute>
<xsl:value-of select="title"
disable-output-escaping="yes" />
</a>
(<xsl:value-of select="pubDate" />)
</li>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
  这个XSLT样式表只有一个模版,用于匹配“/rss/channel”XPath表达式。这个模版先是以粗体显示<title>元素的内容。然后,循环获取每一个<item>元素,对于每一个元素,显示一个到 DisplayItem.aspx 页面的超链接,在查询字符串中传递<item>元素的位置属性。要留意超链接的 target 属性设置为 rbottom,右下部框架的名称。最后,显示每一个新闻项的标题和<pubDate>元素。
  该 XSLT 样式表中有两个项目,并不是每个人都熟悉。首先是 <xsl:value-of> 元素中的 disable-output-escaping="yes" 属性。从本质上讲,这个属性的设置通知 XSLT 引擎不要转义那些非法的 XML 字符,比如:&, < , >, " 和 ’’。为了理解这个设置的意义,就要知道,如果不设置该属性(也就是设置为默认值"no"),那么如果标题包含一个转义的&字符&,那么输出的 html 文件中也会有一个&,而不单单是一个字符&。如果你再仔细想一想,你会发现这种情况会导致很多问题。例如,假设一个聚合文件的标题是“Matt’’s <i>Cool</i> Blog”,如果输出转义没有被禁止,那么输出就会保留 “Matt’’s <i>Cool</i> Blog”,在 Web 页面就会显示为 "Matt’’s <i>Cool</i> Blog"。当用 disable-output-escaping="yes"设置禁止输出转义时,输出就不会被转义,上面的内容就会被当作“Matt’’s <i>Cool</i> Blog”,显示在页面上就是我们想要的“Matt’’s Cool Blog”。
  另一个要注意的是元素<a>。这个奇怪的语法会生成下面的输出内容:
<a href="DisplayItem.aspx?ID=position">news item title</a>
  之所以要使用这种语法,是因为要给 XSLT 样式表中某个你要创建的元素添加一个属性,然后在该元素的标签里使用 <xsl:attribute> 语法 。有关该语法的一些例子可在 W3Schools 网站上找到:The <xsl:attribute> Element。
  最后要注意的是,超链接的ID查询字符串的值是来自于 <xsl:number> 元素,从 position() 函数中返回的值。<xsl:number> 元素仅仅是输出一个数值。position()函数是一个 XPath 函数,用来返回 XML 文档中当前节点的顺序位置。这意味着对于第一个新闻项,position() 函数返回 1,第二个 新闻项,position函数返回 2,以此类推。我们需要记录这个值并将它通过查询字符串传递出去。这样当 DisplayItem.asp 页面被访问时,就可以知道显示 RSS 聚合摘要的什么项目了。
  聪明的读者可能已经注意到,我们的 XSLT 样式表没有全部完成,因为 FeedID 参数没有通过查询字符串传递到 DisplayItem.aspx 页面。要明白 这是为什么,我们回顾一下在 ID 查询串参数中所传递的是用户拟察看详细信息的<item>元素顺序号。也就是说,如果用户点击第四条新闻项,页面 DisplayItem.aspx?ID=4 就会被 加载到右下部分的框架中。问题在于 DisplayItem.aspx 页面无法确定用户希望查看哪一个摘要。有两个不同的方法可以解决这个问题,比如可以在右下部框架中用客户端 Javascript 代码读取右上部框架的 URL,然后确定FeedID 的值。在我看来,更简单的办法是和 ID 参数一起将 FeedID 的值通过查询字符串传递 。
  这样的话,有一个难题是 XSLT 样式表操纵的 RSS XML 数据中并没有 FeedID 值。但是 DisplayNewsItems.aspx 页面知道 FeedID 值,需要一种方法让 XSLT 样式表也知道这个值。通过使用 XSLT参数可以 实现完成。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:ASP.Net实现将Word转换PDF格式

下一篇:C# ASP.NET开发基于Web的RSS阅读器