<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: atom code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Mon, 06 Oct 2008 15:49:20 GMT</pubDate>
    <description>DZone Snippets: atom code</description>
    <item>
      <title>Supporting authenticated web feeds in rss2imbot</title>
      <link>http://snippets.dzone.com/posts/show/6150</link>
      <description>&lt;code&gt;&lt;br /&gt;  def fetch_title(url)&lt;br /&gt;    buffer = open(url, "UserAgent" =&gt; "Ruby-RSS2IMbot").read&lt;br /&gt;    get_title(buffer)&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def fetch_secure_title(url, username, password)&lt;br /&gt;    client = HTTPClient.new&lt;br /&gt;    client.set_auth(url, username, password)&lt;br /&gt;    buffer = client.get(url)&lt;br /&gt;    get_title(buffer.content)&lt;br /&gt;  end&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;here is the modification to function 'action_msg'&lt;br /&gt;&lt;code&gt;&lt;br /&gt;    case action&lt;br /&gt;      when 'add'&lt;br /&gt;        remainder = $3&lt;br /&gt;        rss_feed = remainder[/^(https?sec:\/\/.[^\s]+)/,1]&lt;br /&gt;        unless rss_feed.nil?&lt;br /&gt;          after_url = $'&lt;br /&gt;&lt;br /&gt;          # check if there are authentation details to be included&lt;br /&gt;          username = after_url[/-u\s+(\w+)\s+-p\s+(\w+)/,1]&lt;br /&gt;          puts 'username : ' + username&lt;br /&gt;          if username.nil?&lt;br /&gt;            title = fetch_title(rss_feed)&lt;br /&gt;          else&lt;br /&gt;            password = $2&lt;br /&gt;            puts 'password : ' + password&lt;br /&gt;            title = fetch_secure_title(rss_feed, username, password) &lt;br /&gt;          end&lt;br /&gt;&lt;br /&gt;          add_feed(title,rss_feed, username, password)&lt;br /&gt;        else&lt;br /&gt;           messenger.deliver(buddy,  "That web feed isn't valid'")&lt;br /&gt;        end&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;  def fetch_feed(url5)&lt;br /&gt;&lt;br /&gt;    buffer7 = open(url5, "UserAgent" =&gt; "Ruby-RSS2IMbot").read&lt;br /&gt;    get_item(buffer7)&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def fetch_secure_feed(url5, username, password)&lt;br /&gt;&lt;br /&gt;    client = HTTPClient.new&lt;br /&gt;    client.set_auth(url5, username, password)&lt;br /&gt;    buffer7 = client.get(url5)&lt;br /&gt;     &lt;br /&gt;    get_item(buffer7.content)&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  # displays only the latest unread new message from each feed&lt;br /&gt;  def check_feed(messenger)&lt;br /&gt;    result = false&lt;br /&gt;    puts 'check feed'&lt;br /&gt;    buddy = @user&lt;br /&gt;&lt;br /&gt;    url = URL_BASE + "select/rss2imbot.db/t#{@table}/column=*"&lt;br /&gt;    buffer = open(url, "UserAgent" =&gt; "Ruby-RSS2IMbot").read&lt;br /&gt;&lt;br /&gt;    doc = ''&lt;br /&gt;    doc = Document.new(buffer)&lt;br /&gt;    rows = ''&lt;br /&gt;    rows = doc.root.elements['rows']&lt;br /&gt;    puts 'rows : ' + rows.to_s&lt;br /&gt;    unless rows.nil?&lt;br /&gt;      puts 'rows exist'&lt;br /&gt;      result = rows.elements.each('row'){}.map do |node|&lt;br /&gt;        puts 'looking at a row'&lt;br /&gt;&lt;br /&gt;        # check for a new item&lt;br /&gt;        # if it's different alert the user and update the database, then go to next link,&lt;br /&gt;        rss_title = node.elements["col[@name='title']"].text.to_s&lt;br /&gt;        old_item_link = ''&lt;br /&gt;        old_item_link = node.elements["col[@name='item_link']"].text.to_s + ''&lt;br /&gt;        id = node.elements["col[@name='t1key']"].text.to_s&lt;br /&gt;        rss_link = node.elements["col[@name='link']"].text.to_s&lt;br /&gt;        username = node.elements["col[@name='username']"].text.to_s + ''&lt;br /&gt;        password = node.elements["col[@name='password']"].text.to_s + ''&lt;br /&gt;&lt;br /&gt;        if username.empty? then&lt;br /&gt;          #get the latest item from the rss feed&lt;br /&gt;          new_item_title, new_item_link = fetch_feed(rss_link)&lt;br /&gt;        else&lt;br /&gt;          new_item_title, new_item_link = fetch_secure_feed(rss_link, username, password)&lt;br /&gt;        end&lt;br /&gt;        #puts 'after get_item_title'&lt;br /&gt;        unless new_item_title.empty?&lt;br /&gt;          #puts 'comparing new_item_link ; *' + new_item_link + '*' &lt;br /&gt;          #puts 'with old_item_link ; *' + old_item_link + '*' &lt;br /&gt;&lt;br /&gt;          if new_item_link != old_item_link then&lt;br /&gt;            #update record&lt;br /&gt;            result = update_feed(id, new_item_link)&lt;br /&gt;            messenger.deliver(@user,  '"' + new_item_title + '" ' + new_item_link)&lt;br /&gt;          end&lt;br /&gt;        end&lt;br /&gt;&lt;br /&gt;      end&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;References: &lt;br /&gt; - &lt;a href="http://snippets.dzone.com/posts/show/6081"&gt;XMPP simple feed reader&lt;/a&gt; [dzone.com]&lt;br /&gt; - &lt;a href="http://snippets.dzone.com/posts/show/5097"&gt;Retrieve your Gmail messages as an XML feed&lt;/a&gt; [dzone.com]</description>
      <pubDate>Fri, 26 Sep 2008 13:30:44 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/6150</guid>
      <author>jrobertson (James Robertson)</author>
    </item>
    <item>
      <title>XMPP simple feed reader</title>
      <link>http://snippets.dzone.com/posts/show/6081</link>
      <description>This Ruby script is based on the code from &lt;a href="http://snippets.dzone.com/posts/show/5759"&gt;Build your own Twitter 'track' feature&lt;/a&gt; [dzone.com] but now the latest entry can be tracked for any RSS or Atom feed.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;#!/usr/bin/ruby&lt;br /&gt;&lt;br /&gt;#file: xmppserver_db1.rb&lt;br /&gt;&lt;br /&gt;require 'rubygems'  &lt;br /&gt;require 'open-uri'&lt;br /&gt;require 'xmpp4r-simple'&lt;br /&gt;require 'rexml/document'&lt;br /&gt;include REXML&lt;br /&gt;&lt;br /&gt;URL_BASE = 'http://yourwebsite.com/sqlite3/'&lt;br /&gt;messenger = Jabber::Simple.new('jeeves3@jamesrobertson.eu', "passwordsecret")&lt;br /&gt;$file = ''&lt;br /&gt;&lt;br /&gt;class String&lt;br /&gt;  def escape()&lt;br /&gt;    URI.escape(self).gsub(/\?/,'%3F')&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def get_title(url)&lt;br /&gt;&lt;br /&gt;  title = ''&lt;br /&gt;  buffer = open(url, "UserAgent" =&gt; "Ruby-RSS2IMbot").read&lt;br /&gt;&lt;br /&gt;  doc = Document.new(buffer)&lt;br /&gt;  # get the title&lt;br /&gt;  node_title = doc.root.elements['channel/title|title']&lt;br /&gt;  puts 'title : ' + node_title.to_s&lt;br /&gt;  unless node_title.nil?&lt;br /&gt;    title = node_title.text.to_s&lt;br /&gt;  end&lt;br /&gt;  title&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;# displays only the latest unread new message from each feed&lt;br /&gt;def check_feed(messenger)&lt;br /&gt;  result = false&lt;br /&gt;  puts 'check feed'&lt;br /&gt;  buddy = 'james@jamesrobertson.eu'&lt;br /&gt;&lt;br /&gt;  url = URL_BASE + "select/rss2imbot.db/t1/column=*"&lt;br /&gt;  buffer = open(url, "UserAgent" =&gt; "Ruby-RSS2IMbot").read&lt;br /&gt;  doc = Document.new(buffer)&lt;br /&gt;  rows = doc.root.elements['rows']&lt;br /&gt;  puts 'rows : ' + rows.to_s&lt;br /&gt;  unless rows.nil?&lt;br /&gt;    result = rows.elements.each('row'){}.map do |node|&lt;br /&gt;      # check for a new item&lt;br /&gt;      # if it's different alert the user and update the database, then go to next link,&lt;br /&gt;      rss_title = node.elements["col[@name='title']"].text.to_s&lt;br /&gt;      old_item_title = node.elements["col[@name='item_title']"].text.to_s&lt;br /&gt;      id = node.elements["col[@name='t1key']"].text.to_s&lt;br /&gt;      rss_link = node.elements["col[@name='link']"].text.to_s&lt;br /&gt;&lt;br /&gt;      #get the latest item from the rss feed&lt;br /&gt;      new_item_title, link = get_item_title(rss_link)&lt;br /&gt;&lt;br /&gt;      if new_item_title != old_item_title then&lt;br /&gt;&lt;br /&gt;        #update record&lt;br /&gt;        result = update_feed(id, new_item_title)&lt;br /&gt;        messenger.deliver(buddy,  '"' + new_item_title + '" ' + link)&lt;br /&gt;      end&lt;br /&gt;&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def update_feed(id, item_title)&lt;br /&gt;  result = false&lt;br /&gt;&lt;br /&gt;  url = URL_BASE + "update/rss2imbot.db/t1/set-column=item_title:#{item_title.escape}&amp;t1key=#{id}"&lt;br /&gt;  buffer = open(url, "UserAgent" =&gt; "Ruby-RSS2IMbot").read&lt;br /&gt;  doc = Document.new(buffer)&lt;br /&gt;  node_result = doc.root.attribute('method')&lt;br /&gt;  result = true unless node_result.nil?&lt;br /&gt;  result&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def get_item_title(url)&lt;br /&gt;&lt;br /&gt;  title = ''&lt;br /&gt;  buffer = open(url, "UserAgent" =&gt; "Ruby-RSS2IMbot").read&lt;br /&gt;&lt;br /&gt;  doc = Document.new(buffer)&lt;br /&gt;  # get the title&lt;br /&gt;  node_title = doc.root.elements['channel/item/title|entry/title']&lt;br /&gt;  unless node_title.nil?&lt;br /&gt;    title = node_title.text.to_s&lt;br /&gt;    node_link = doc.root.elements['channel/item/link|entry/link']&lt;br /&gt;    unless node_link.nil?&lt;br /&gt;      unless node_link.text.to_s.empty? then&lt;br /&gt;        link = node_link.text.to_s # it's an rss feed&lt;br /&gt;      else&lt;br /&gt;        link = node_link.attribute('href').to_s # it's an atom feed&lt;br /&gt;      end&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;  return title, link&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def action_msg(messenger, buddy, message)&lt;br /&gt;&lt;br /&gt;  action = message[/^(\w+)(\s+)?(.*)?/,1]&lt;br /&gt;&lt;br /&gt;  case action&lt;br /&gt;    when 'add'&lt;br /&gt;      rss_feed = $3&lt;br /&gt;      if rss_feed.match(/^http:\/\/.*$/) then&lt;br /&gt;        title = get_title(rss_feed)&lt;br /&gt;        add_feed(title,rss_feed)&lt;br /&gt;      else&lt;br /&gt;         messenger.deliver(buddy,  "That web feed isn't valid'")&lt;br /&gt;      end&lt;br /&gt;&lt;br /&gt;    when 'list'&lt;br /&gt;      url = URL_BASE + "select/rss2imbot.db/t1/column=*"&lt;br /&gt;      buffer = open(url,"UserAgent" =&gt; "Ruby-IMBot").read&lt;br /&gt;      doc = Document.new(buffer)&lt;br /&gt;      rows = doc.root.elements['rows']&lt;br /&gt;      unless rows.nil?&lt;br /&gt;        result = rows.elements.each('row'){}.map do |node|&lt;br /&gt;          node.attribute('id').to_s + '. ' + node.elements["col[@name='title']"].text.to_s&lt;br /&gt;        end&lt;br /&gt;        messenger.deliver(buddy,  result.inspect)&lt;br /&gt;      end&lt;br /&gt;&lt;br /&gt;    when 'remove'&lt;br /&gt;      id = $3&lt;br /&gt;&lt;br /&gt;      url = URL_BASE + 'select/rss2imbot.db/t1/column=title&amp;t1key=1'&lt;br /&gt;      buffer = open(url,"UserAgent" =&gt; "Ruby-IMBot").read&lt;br /&gt;      doc = Document.new(buffer)&lt;br /&gt;      node_col = doc.root.elements['rows/row/col']&lt;br /&gt;      unless node_col.nil? &lt;br /&gt;  &lt;br /&gt;        title = node_col.text.to_s&lt;br /&gt;        messenger.deliver(buddy,   'remove \'' + title + '\' (y/n)') &lt;br /&gt;        elapsed = 0&lt;br /&gt;        start_time = Time.now&lt;br /&gt;        answered = false&lt;br /&gt;        response = ''&lt;br /&gt;&lt;br /&gt;        while (elapsed &lt; 30 and not answered == true)&lt;br /&gt;          messenger.received_messages do |msg|  &lt;br /&gt;            puts msg.body&lt;br /&gt;            if msg.body.match(/^(y|n)$/) then&lt;br /&gt;              response = msg.body&lt;br /&gt;              answered = true            &lt;br /&gt;            end&lt;br /&gt;          end&lt;br /&gt;          elapsed = Time.now - start_time        &lt;br /&gt;        end&lt;br /&gt;        messenger.deliver(buddy, 'you took too long to answer, I\'m *not* removing any feed now!') if elapsed &gt;= 30&lt;br /&gt;        if response == 'y' then&lt;br /&gt;          messenger.deliver(buddy,   ' will now remove ' + title)  &lt;br /&gt;          url = URL_BASE + "delete/rss2imbot.db/t1/t1key=#{id}"&lt;br /&gt;          result_buffer = open(url,"UserAgent" =&gt; "Ruby-IMBot").read&lt;br /&gt;          doc_result = Document.new(result_buffer)&lt;br /&gt;          node_result = doc_result.root.attribute('method')&lt;br /&gt;          messenger.deliver(buddy,   '\'' + title + '\' has been removed.') unless node_result.nil?&lt;br /&gt;        end&lt;br /&gt;      end&lt;br /&gt;&lt;br /&gt;    when 'help'&lt;br /&gt;      messenger.deliver(buddy,   "Help: 'add' a feed, 'list' all feeds, or 'remove' a feed.") &lt;br /&gt;  else&lt;br /&gt;    puts 'sorry I don\'t know how to process that. Type \'help\' for a list of commands.'&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def add_feed(title, link)&lt;br /&gt;  result = false&lt;br /&gt;&lt;br /&gt;  puts "insert/rss2imbot.db/t1/title=#{title.escape}&amp;link=#{link.escape}"&lt;br /&gt;  url = URL_BASE + "insert/rss2imbot.db/t1/title=#{title.escape}&amp;link=#{link.escape}"&lt;br /&gt;  buffer = open(url, "UserAgent" =&gt; "Ruby-RSS2IMbot").read&lt;br /&gt;  doc = Document.new(buffer)&lt;br /&gt;  node_result = doc.root.attribute('method')&lt;br /&gt;  result = true unless node_result.nil?&lt;br /&gt;  result&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;while true&lt;br /&gt;&lt;br /&gt;  # check the feeds every 1 minute.&lt;br /&gt;  check_feed(messenger) if Time.now.strftime("%S").to_i &lt;= 3&lt;br /&gt;  messenger.received_messages do |msg|  &lt;br /&gt;&lt;br /&gt;    message = URI.unescape(msg.body).gsub(/&amp;lt;/,'&lt;').gsub(/&amp;gt;/,'&gt;').gsub(/&amp;apos;/,'\'').gsub(/&amp;quot;/,'"').gsub(/&amp;amp;/,'&amp;')&lt;br /&gt;    buddy = msg.from&lt;br /&gt;&lt;br /&gt;    messenger.deliver(buddy,  "you said ... " + message)    &lt;br /&gt;    action_msg(messenger,buddy, message)&lt;br /&gt;&lt;br /&gt;  end  &lt;br /&gt;  sleep 2&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;test:&lt;br /&gt;[01:20:38] jeeves3 is now Available (Available)&lt;br /&gt;[01:20:41] James: list&lt;br /&gt;[01:20:42] jeeves3: you said ... list&lt;br /&gt;[01:20:43] jeeves3: ["1. ruby - Twitter Search"]&lt;br /&gt;[01:21:04] jeeves3: "babysitting Ruby while the missus gets some accupuncture.. now covered in vomit too - thanks Ruby!" http://twitter.com/gregdwyer/statuses/922733451&lt;br /&gt;[01:21:39] James: add http://snippets.dzone.com/rss&lt;br /&gt;[01:21:41] jeeves3: you said ... add http://snippets.dzone.com/rss&lt;br /&gt;[01:22:16] jeeves3: "Test" http://feeds.dzone.com/~r/dzone/snippets/~3/393549326/6080&lt;br /&gt;[01:22:20] James: list&lt;br /&gt;[01:22:20] jeeves3: you said ... list&lt;br /&gt;[01:22:21] jeeves3: ["1. ruby - Twitter Search", "2. DZone Snippets: Store, sort and share source code, with tag goodness"]&lt;br /&gt;[01:22:49] James: remove 1&lt;br /&gt;[01:22:49] jeeves3: you said ... remove 1&lt;br /&gt;[01:22:51] jeeves3: remove 'ruby - Twitter Search' (y/n)&lt;br /&gt;[01:22:53] James: y&lt;br /&gt;[01:22:53] jeeves3:  will now remove ruby - Twitter Search&lt;br /&gt;[01:22:54] jeeves3: 'ruby - Twitter Search' has been removed.&lt;br /&gt;[01:22:57] James: list&lt;br /&gt;[01:22:58] jeeves3: you said ... list&lt;br /&gt;[01:23:00] jeeves3: ["1. DZone Snippets: Store, sort and share source code, with tag goodness"]</description>
      <pubDate>Tue, 16 Sep 2008 00:29:46 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/6081</guid>
      <author>jrobertson (James Robertson)</author>
    </item>
    <item>
      <title>Retrieve your Gmail messages as an XML feed</title>
      <link>http://snippets.dzone.com/posts/show/5097</link>
      <description>This Ruby example shows how to retrieve your most recent email as an atom XML feed from the Google Apps website.  &lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;require 'rubygems'&lt;br /&gt;require 'httpclient'&lt;br /&gt;&lt;br /&gt;url = "https://mail.google.com/a/yourwebsite.com/feed/atom"&lt;br /&gt;client = HTTPClient.new&lt;br /&gt;client.debug_dev = STDOUT if $DEBUG&lt;br /&gt;client.set_auth(url, 'yourname@yourwebsite.com', 'yourpassword')&lt;br /&gt;resp = client.get(url)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Note: You might require to gem install httpclient.</description>
      <pubDate>Sun, 03 Feb 2008 16:29:06 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5097</guid>
      <author>jrobertson (James Robertson)</author>
    </item>
    <item>
      <title>RSS/Atom Autodiscovery</title>
      <link>http://snippets.dzone.com/posts/show/3802</link>
      <description>// description of your code here&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;link rel="alternate" type="application/rss+xml" title="RSS Feed" href="rss.xml" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- or... //--&gt;&lt;br /&gt;&lt;br /&gt;&lt;link rel="alternate" type="application/atom+xml" title="Atom Feed" href="Atom.xml" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Thu, 12 Apr 2007 04:33:43 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/3802</guid>
      <author>nathancarnes (Nathan Carnes)</author>
    </item>
    <item>
      <title>Blogmarks to Html conversion</title>
      <link>http://snippets.dzone.com/posts/show/1206</link>
      <description>This file is intended to transform a Blogmarks atom feed (http://api.blogmarks.net/user/ms_michel) into html code fragment to be included in a complete page.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;?xml version="1.0" encoding="utf-8"?&gt;&lt;br /&gt;&lt;xsl:stylesheet version="1.0" xmlns:atom="http://purl.org/atom/ns#draft-ietf-atompub-format-05" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:dc="http://purl.org/dc/elements/1.1/"&gt;&lt;br /&gt;  &lt;xsl:output method="html" /&gt;&lt;br /&gt;  &lt;xsl:template match="/"&gt;&lt;br /&gt;    &lt;xsl:apply-templates select="/atom:feed/atom:head" mode="before" /&gt;&lt;br /&gt;    &lt;xsl:apply-templates select="/atom:feed/atom:entry" /&gt;&lt;br /&gt;    &lt;xsl:apply-templates select="/atom:feed/atom:head" mode="after" /&gt;&lt;br /&gt;  &lt;/xsl:template&gt;&lt;br /&gt;  &lt;xsl:template match="atom:feed/atom:head" mode="before" &gt;&lt;br /&gt;    &lt;!-- &lt;h3&gt;&lt;xsl:value-of select="atom:title" /&gt;&lt;/h3&gt; --&gt;&lt;br /&gt;  &lt;/xsl:template&gt;&lt;br /&gt;  &lt;xsl:template match="atom:feed/atom:head" mode="after"&gt;&lt;br /&gt;    &lt;p&gt;&lt;a href="{atom:link[@rel='alternate']/@href}"&gt;&lt;img src="http://blogmarks.net/img/88x31_neg.png" alt="blogmarks.net" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;  &lt;/xsl:template&gt;&lt;br /&gt;  &lt;xsl:template match="atom:feed/atom:entry"&gt;&lt;br /&gt;    &lt;div&gt;&lt;br /&gt;      &lt;xsl:choose&gt;&lt;br /&gt;        &lt;xsl:when test="position() mod 2 = 1"&gt;&lt;br /&gt;          &lt;xsl:attribute name="class"&gt;bm_blogmarks bm_odd&lt;/xsl:attribute&gt;&lt;br /&gt;        &lt;/xsl:when&gt;&lt;br /&gt;        &lt;xsl:otherwise&gt;&lt;br /&gt;          &lt;xsl:attribute name="class"&gt;bm_blogmarks bm_even&lt;/xsl:attribute&gt;&lt;br /&gt;        &lt;/xsl:otherwise&gt;&lt;br /&gt;      &lt;/xsl:choose&gt;&lt;br /&gt;      &lt;a href="{atom:link[@rel='related']/@href}"&gt;&lt;img src="{atom:link[@rel='image']/@href}" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;      &lt;h4&gt;&lt;a href="{atom:link[@rel='related']/@href}"&gt;&lt;xsl:value-of select="atom:title" /&gt;&lt;/a&gt;&lt;/h4&gt;&lt;br /&gt;      &lt;p&gt;&lt;xsl:value-of select="atom:summary" disable-output-escaping="yes" /&gt;&lt;/p&gt;&lt;br /&gt;      &lt;p class="blogmarks-tags"&gt;&lt;br /&gt;        &lt;xsl:value-of select="substring(atom:published, 0, 11)" /&gt;&lt;br /&gt;        &lt;xsl:if test="atom:category"&gt;&lt;br /&gt;          &lt;xsl:for-each select="atom:category"&gt;&lt;br /&gt;            &lt;xsl:text&gt; - &lt;/xsl:text&gt;&lt;a href="{@term}{@sheme}"&gt;&lt;xsl:value-of select="@label" /&gt;&lt;/a&gt;&lt;br /&gt;          &lt;/xsl:for-each&gt;&lt;br /&gt;        &lt;/xsl:if&gt;&lt;br /&gt;      &lt;/p&gt;&lt;br /&gt;    &lt;/div&gt;&lt;br /&gt;  &lt;/xsl:template&gt;&lt;br /&gt;&lt;/xsl:stylesheet&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;The generated html is inspired by the one used on Hot Links (http://dev.upian.com/hotlinks/). It can be styled with the following css:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;.bm_blogmarks {&lt;br /&gt;	margin: 10px auto;&lt;br /&gt;	padding: 1%;&lt;br /&gt;	background-color: #f5f5f5;&lt;br /&gt;	border: 1px solid #d9d9d9;&lt;br /&gt;	width: 97%;&lt;br /&gt;	overflow:auto;&lt;br /&gt;}&lt;br /&gt;.bm_even {&lt;br /&gt;    background-color: #fcfcfc;&lt;br /&gt;}&lt;br /&gt;.bm_blogmarks h4 {&lt;br /&gt;	margin-top: 0;&lt;br /&gt;}&lt;br /&gt;.bm_blogmarks p.bm_tags {&lt;br /&gt;	margin-bottom: 0;&lt;br /&gt;	display: block;&lt;br /&gt;	clear: left;&lt;br /&gt;}&lt;br /&gt;.bm_blogmarks img {&lt;br /&gt;	margin: 0 0px 5px 10px;&lt;br /&gt;	float: right;&lt;br /&gt;	border: 0;&lt;br /&gt;	clear: none;&lt;br /&gt;	width: 144px;&lt;br /&gt;	height: 107px;&lt;br /&gt;}&lt;br /&gt;.bm_even img {&lt;br /&gt;	margin: 0 10px 5px 0px;&lt;br /&gt;	float: left;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Fri, 20 Jan 2006 01:18:44 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/1206</guid>
      <author>ms_michel (Michel)</author>
    </item>
    <item>
      <title>Atom to Html conversion</title>
      <link>http://snippets.dzone.com/posts/show/1162</link>
      <description>This file is intended to transform an Atom feed into html code fragment to be included in a complete page.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;?xml version="1.0" encoding="utf-8"?&gt;&lt;br /&gt;&lt;xsl:stylesheet version="1.0"&lt;br /&gt;  xmlns:atom="http://purl.org/atom/ns#"&lt;br /&gt;  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&lt;br /&gt;  xmlns:dc="http://purl.org/dc/elements/1.1/"&gt;&lt;br /&gt;    &lt;xsl:output method="html"/&gt;&lt;br /&gt;    &lt;xsl:template match="/"&gt;&lt;br /&gt;    &lt;xsl:apply-templates select="/atom:feed/atom:head"/&gt;&lt;br /&gt;        &lt;xsl:apply-templates select="/atom:feed"/&gt;&lt;br /&gt;    &lt;/xsl:template&gt;&lt;br /&gt;    &lt;xsl:template match="atom:feed/atom:head"&gt;&lt;br /&gt;        &lt;h3&gt;&lt;xsl:value-of select="atom:title"/&gt;&lt;/h3&gt;&lt;br /&gt;        &lt;xsl:if test="atom:tagline"&gt;&lt;p&gt;&lt;xsl:value-of select="atom:tagline"/&gt;&lt;/p&gt;&lt;/xsl:if&gt;&lt;br /&gt;        &lt;xsl:if test="atom:subtitle"&gt;&lt;p&gt;&lt;xsl:value-of select="atom:subtitle"/&gt;&lt;/p&gt;&lt;/xsl:if&gt;&lt;br /&gt;    &lt;/xsl:template&gt;&lt;br /&gt;    &lt;xsl:template match="/atom:feed"&gt;&lt;br /&gt;        &lt;h3&gt;&lt;xsl:value-of select="atom:title"/&gt;&lt;/h3&gt;&lt;br /&gt;        &lt;xsl:if test="atom:tagline"&gt;&lt;p&gt;&lt;xsl:value-of select="atom:tagline"/&gt;&lt;/p&gt;&lt;/xsl:if&gt;&lt;br /&gt;        &lt;xsl:if test="atom:subtitle"&gt;&lt;p&gt;&lt;xsl:value-of select="atom:subtitle"/&gt;&lt;/p&gt;&lt;/xsl:if&gt;&lt;br /&gt;        &lt;ul&gt;&lt;br /&gt;            &lt;xsl:apply-templates select="atom:entry"/&gt;&lt;br /&gt;        &lt;/ul&gt;&lt;br /&gt;    &lt;/xsl:template&gt;&lt;br /&gt;    &lt;xsl:template match="atom:entry"&gt;&lt;br /&gt;        &lt;li&gt;&lt;br /&gt;            &lt;a href="{atom:link[@rel='related']/@href}" title="{substring(atom:published, 0, 11)}"&gt;&lt;xsl:value-of select="atom:title"/&gt;&lt;/a&gt;&lt;br /&gt;            &lt;xsl:choose&gt;&lt;br /&gt;                &lt;xsl:when test="atom:content != ''"&gt;&lt;br /&gt;                    &lt;p&gt;&lt;xsl:value-of select="atom:content" disable-output-escaping="yes" /&gt;&lt;/p&gt;&lt;br /&gt;                &lt;/xsl:when&gt;&lt;br /&gt;                &lt;xsl:otherwise&gt;&lt;br /&gt;                    &lt;p&gt;&lt;xsl:value-of select="atom:summary" disable-output-escaping="yes" /&gt;&lt;/p&gt;&lt;br /&gt;                &lt;/xsl:otherwise&gt;&lt;br /&gt;            &lt;/xsl:choose&gt;&lt;br /&gt;        &lt;/li&gt;&lt;br /&gt;    &lt;/xsl:template&gt;&lt;br /&gt;&lt;/xsl:stylesheet&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Mon, 16 Jan 2006 19:59:16 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/1162</guid>
      <author>ms_michel (Michel)</author>
    </item>
    <item>
      <title>Atom rxml template</title>
      <link>http://snippets.dzone.com/posts/show/559</link>
      <description>This rxml template (modified from the one in blinksale.com) generates valid Atom 1.0 feeds. If you have a partial to create HTML for each item, they can be included in the feed's "content" elements.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;xml.instruct!&lt;br /&gt;&lt;br /&gt;xml.feed "xmlns" =&gt; "http://www.w3.org/2005/Atom" do&lt;br /&gt;&lt;br /&gt;  xml.title   "Feed Name"&lt;br /&gt;  xml.link    "rel" =&gt; "self", "href" =&gt; url_for(:only_path =&gt; false, :controller =&gt; 'feeds', :action =&gt; 'atom')&lt;br /&gt;  xml.link    "rel" =&gt; "alternate", "href" =&gt; url_for(:only_path =&gt; false, :controller =&gt; 'posts')&lt;br /&gt;  xml.id      url_for(:only_path =&gt; false, :controller =&gt; 'posts')&lt;br /&gt;  xml.updated @posts.first.updated_at.strftime "%Y-%m-%dT%H:%M:%SZ" if @posts.any?&lt;br /&gt;  xml.author  { xml.name "Author Name" }&lt;br /&gt;&lt;br /&gt;  @posts.each do |post|&lt;br /&gt;    xml.entry do&lt;br /&gt;      xml.title   post.title&lt;br /&gt;      xml.link    "rel" =&gt; "alternate", "href" =&gt; url_for(:only_path =&gt; false, :controller =&gt; 'posts', :action =&gt; 'show', :id =&gt; post.id)&lt;br /&gt;      xml.id      url_for(:only_path =&gt; false, :controller =&gt; 'posts', :action =&gt; 'show', :id =&gt; post.id)&lt;br /&gt;      xml.updated post.updated_at.strftime "%Y-%m-%dT%H:%M:%SZ"&lt;br /&gt;      xml.author  { xml.name post.author.name }&lt;br /&gt;      xml.summary "Post summary"&lt;br /&gt;      xml.content "type" =&gt; "html" do&lt;br /&gt;        xml.text! render(:partial =&gt; "posts/post", :post =&gt; post)&lt;br /&gt;      end&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sat, 06 Aug 2005 02:53:28 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/559</guid>
      <author>sco (Scott Raymond)</author>
    </item>
    <item>
      <title>Atom / RSS feed of your GMail account</title>
      <link>http://snippets.dzone.com/posts/show/262</link>
      <description>&lt;code&gt;https://USERNAME:PASSWORD@gmail.google.com/gmail/feed/atom&lt;/code&gt;</description>
      <pubDate>Sat, 07 May 2005 22:45:40 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/262</guid>
      <author>peter (Peter Cooperx)</author>
    </item>
  </channel>
</rss>
