Skip to main content

Adding and formatting an Atom Feed in .NET with XSLT

A bit about Atom

Displaying Atom feeds in a .NET page is pretty straight forward with just an XML control, and an XSL stylesheet for transforming the XML. As well as for Atom feeds, the info below can also be used for merging an RSS feed into a webpage.

Atom is an XML-based format used by many blogs and the like, allowing for the syndication of information across the web. More info can be found about Atom at:
Another bit but about XSL

Technically XSL is family of technologies that allow for the tranformation and presentation of XML. XSLT is the language used for transformations, and is a subset of XSL, but for most purposes people use XSL and XSLT interchangably. Have a look at W3C - The Extensible Stylesheet Language Family (XSL) for more info.

And Finally - Getting an Atom feed in to a page

To get started with displaying an Atom feed in a .NET page, first off just add an XML control into the web page.

<asp:Xml ID="xmlRSSFeed01" runat="server"></asp:xml>

Next, an XSL file is needed that will be used by the control to format the XML from the Atom feed into HTML.

The following code is just a basic layout to display an Atom feed and is placed into an XSL file within the project.

Three XSL templates are used. The first template is used to display a header and info about the feed. Within this template a second template is called which iterates through each entry in the feed and displays the date, title and summary. The third template is used to format the datetime stamp of the entry and return it in a more human friendly as opposed to the ISO 8601 UTC standard. Feel free to take this code and paste into an XSL file to start working with transforming an Atom feed.

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="html"/>

  <xsl:template match="/atom:feed">

    <table>
      <tr>
        <h1>
          <xsl:value-of select="atom:title"/>
        </h1>
        <p>
          <a href="{atom:link[@rel='alternate']/@href}">
            <xsl:value-of select="atom:link[@rel='alternate']/@href"/>
          </a>
        </p>
        <p>
          <xsl:value-of select="atom:subtitle"/>
        </p>
      </tr>
      <tr>
        <th>Date</th>
        <th>Title</th>
      </tr>
      <xsl:apply-templates select="atom:entry" />
    </table>
  </xsl:template>

  <xsl:template match="atom:entry">

    <tr>
      <td>
        <p>
          <xsl:call-template name="FormatDateTime">
            <xsl:with-param name="DateTime" select="atom:published"/>
          </xsl:call-template>
        </p>
      </td>
      <td>
        <p>
          <a href="{atom:link[@rel='alternate']/@href}">
            <xsl:value-of select="atom:title"/>
          </a>
        </p>
      </td>
    </tr>
    <tr>
      <td colspan="2">
        <p>
          <xsl:value-of select="atom:summary"/>
        </p>
      </td>
    </tr>
  </xsl:template>

  <xsl:template name="FormatDateTime">

    <xsl:param name="DateTime" />


    <xsl:variable name="mo">

      <xsl:value-of select="substring($DateTime,6,2)" />
    </xsl:variable>
    <xsl:variable name="day">
      <xsl:value-of select="substring($DateTime,9,2)" />
    </xsl:variable>
    <xsl:variable name="year">
      <xsl:value-of select="substring($DateTime,1,4)" />
    </xsl:variable>
    <xsl:variable name="time">
      <xsl:value-of select="substring($DateTime,12,8)" />
    </xsl:variable>
    <xsl:variable name="hh">
      <xsl:value-of select="substring($time,1,2)" />
    </xsl:variable>
    <xsl:variable name="mm">
      <xsl:value-of select="substring($time,4,2)" />
    </xsl:variable>
    <xsl:variable name="ss">
      <xsl:value-of select="substring($time,7,2)" />
    </xsl:variable>

    <xsl:value-of select="$day" />
    <xsl:text>/</xsl:text>
    <xsl:value-of select="$mo" />
    <xsl:text>/</xsl:text>
    <xsl:value-of select="$year" />

  </xsl:template>  

</xsl:stylesheet>


To bring it all together requires just a few lines of code in the code behind file of the page.

protected void Page_Load(object sender, EventArgs e)
{
  if (!Page.IsPostBack)
  {
    //set transform source for feed (the xsl file)
    this.xmlRSSFeed01.TransformSource = "~/rss_feed.xsl";


    //load Atom feed into XPathDocument and create navigator
    XPathDocument xpDoc = new XPathDocument("http://linktoatomfeedhere/feed.xml");
    XPathNavigator xpNav = xpDoc.CreateNavigator();



    //load the XML into the XML control
    this.xmlRSSFeed01.XPathNavigator = xpNav;
  }
}



In conclusion

With the Atom feed, the .NET control, and the XSL file, the feed (and with a few tweaks, any RSS feed) can be integrated into a page in anyway required.

Comments

Popular posts from this blog

Which blog engine?

So the time has come to move to a more advanced blog engine for my blog. blogger.com , Google's blogging service, has served me well. It's incredibly easy to use and to get started with, along with having some great features such as inbuilt stats; however now I need a few more advanced features and greater control over the blog. There's a vast array of blog engines out there, some free, some paid for, some hosted, some self-hosted, and picking which one is best or the right choice could be a little bit tricky. This article from Mashable lists most of the main options and bigger players -  http://mashable.com/2007/08/06/free-blog-hosts/ . There are a few parameters that I've kind of decided on Ease of installation/compatibility and support with web hosts Simple to use. I don't want to spend ages clicking around just to add a post or format it. Feature rich and well supported. Most blog engines should have a fairly standard set of features now such RSS/ATOM fe

Enable .NET 8 Preview in Visual Studio

Download the SDK using Download .NET 8.0 (Linux, macOS, and Windows) (microsoft.com)  and install it. To enable projects to target the .NET 8 preview framework, the preview option in Visual Studio needs to be enabled, otherwise the option to target .NET 8 will not be available as shown below when setting up a new project (or trying to upgrade an existing one). To allow .NET 8 Preview to be used as a target framework for projects, the preview option needs to be enabled in Visual Studio. Open Visual Studio and select "Continue without code" In Visual Studio, select Tools then Options In Options, under Environment, select Preview Features and enable Use previews of the .NET SDK.

SQL Server - Remove Non-Alphanumeric Characters from String

The following SQL function will remove and strip all non-alphanumeric characters from a string. CREATE FUNCTION [dbo].[fncRemoveNonAlphanumericChars](@Temp VarChar(1000)) RETURNS VarChar(1000) AS BEGIN WHILE PatIndex('%[^A-Za-z0-9]%', @Temp) > 0 SET @Temp = Stuff(@Temp, PatIndex('%[^A-Za-z0-9]%', @Temp), 1, '') RETURN @TEmp END Example: SELECT dbo.fncRemoveNonAlphanumericChars('abc...DEF,,,GHI(((123)))456jklmn') Result: abcDEFGHI123456jklmn