Parse RSS feed from Javascript Tag(s): Varia
Internet Explorer only!
This HowTo load a RSS feed and then apply an XSLT transformation to reformat the items to be displayed in a page.
All the processing is done on the client-side. The transformation is simple, the XSL loops through the item entries and extract the title, description and pubDate.
[rss.xsl]
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:saxon="http://saxon.sf.net/"
version="2.0">
<xsl:template match="channel">
<html><head></head><body>
<h2>Real's HowTo latest entries</h2>
<xsl:for-each select="item">
<strong><a HREF="{link}" target="_top"><xsl:value-of select="title"/></a></strong><br/>
<xsl:variable name="ligne">
<xsl:value-of select="description"/>
</xsl:variable>
<xsl:choose>
<xsl:when test="string-length($ligne) > 30">
<xsl:value-of select="substring($ligne, 1, 30)" /> ...
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$ligne" />
</xsl:otherwise>
</xsl:choose>
<br/><small><i><xsl:value-of select="pubDate"/></i></small>
<p/>
</xsl:for-each>
<p/>
<hr/>
</body></html>
</xsl:template>
</xsl:stylesheet>
[rss.html]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML><HEAD><TITLE>rss from js</TITLE></HEAD>
<BODY>
<STYLE type="text/css">
BODY {font-family:verdana; font-size:8pt}
A {font-family:verdana; font-size:8pt}
A:hover {color:red}
</STYLE>
<SCRIPT type="text/javascript">
var xml = new ActiveXObject("Microsoft.XMLDOM")
xml.async = false
xml.load("http://www.rgagnon.com/feed.xml")
var xsl = new ActiveXObject("Microsoft.XMLDOM")
xsl.async = false
xsl.load("rss.xsl")
document.write(xml.transformNode(xsl))
</SCRIPT>
</BODY>
</HTML>
Since the transformation is done on the client-side, this can be used to solve the problem if the feed is hosted in a protected site. This a typical problem with a Sharepoint installation in a corporate environment where a site or blog access is restricted. The regular Sharepoint RSS feed webpart (which is server-side component) can not handled a feed requiring an authentication. But with this Javascript solution, Internet Explorer will handle that for us since we are running on the client-side.
But with a feed coming from a Sharepoint site, we need to modify the XSL a little bit since Sharepoint has the habit to add various HTML tags in the description section. The XSL now provides a special template to clean-up any HTML tags in description section.
[sp-rss.xsl]
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:saxon="http://saxon.sf.net/"
version="2.0">
<xsl:template name="deleteHtmlTags">
<xsl:param name="html"/>
<xsl:choose>
<xsl:when test="contains($html, '<')">
<xsl:value-of select="substring-before($html, '<')"/>
<xsl:call-template name="deleteHtmlTags">
<xsl:with-param name="html" select="substring-after($html, '>')"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$html"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="channel">
<html><head></head><body>
<xsl:for-each select="item">
<div align="right">
<small>
<b><i><xsl:value-of select="category"/></i></b>
</small>
</div>
<strong><a HREF="{link}" target="_top"><xsl:value-of select="title"/></a></strong><br/>
<xsl:variable name="ligne">
<xsl:call-template name="deleteHtmlTags">
<xsl:with-param name="html" select="substring(description,30)" />
</xsl:call-template>
</xsl:variable>
<xsl:choose>
<xsl:when test="string-length($ligne) > 30">
<xsl:value-of select="substring($ligne, 1, 30)" /> ...
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$ligne" />
</xsl:otherwise>
</xsl:choose>
<br/><small><i><xsl:value-of select="pubDate"/></i></small>
<p/>
</xsl:for-each>
<p/>
<hr/>
</body></html>
</xsl:template>
</xsl:stylesheet>
Send comment, question or suggestion to howto@rgagnon.com