Top

14.7.28. Rendering the RSS feed in WML format

The user's blog RSS file could be rendered in WML format for accessing with mobile devices. To do that built-in PL post-processing hook for blog virtual directory is introduced (DB.DBA.BLOG_RSS2WML_PP). It working together with a XSL-T style-sheet which converts the RSS in WML format.

To enable this functionality the blogger should enter '*wml-default*' as RSSFilter option on settings page. Or if he/she has an own XSL-T filter for WML can enter its URL instead.

The DB.DBA.BLOG_RSS2WML_PP post-processing hook:

create procedure DB.DBA.BLOG_RSS2WML_PP ()
  {
    declare accept, upar, pars any;
    declare lines any;
    lines := http_request_header ();
    accept := http_request_header (lines, 'Accept');
    if (not isstring (accept))
      accept := '';
    upar := http_request_get ('QUERY_STRING');
    if (regexp_match ('text/vnd\.wap\.wml', accept))
      {
	if (http_path () like '%/rss.xml')
	  {
	    declare opts, filt, bid any;
	    whenever not found goto exitp;
	    select top 1 BI_BLOG_ID into bid from SYS_BLOG_INFO where
	    http_path () like BI_HOME || '%' order by length (BI_HOME) desc;
	    select deserialize (blob_to_string (BI_OPTIONS)) into opts from SYS_BLOG_INFO where BI_BLOG_ID = bid;

	    if (not isarray(opts))
	      opts := vector ();

	    filt := get_keyword ('RSSFilter', opts, '');

	    if (filt = '*wml-default*')
	      filt := 'http://local.virt/rss2wml.xsl';

	    if (not isstring (filt) or not xslt_is_sheet (filt))
	      goto exitp;

	    if (length (upar) = 0)
	      {
                http_xslt (filt);
	      }
	    else
	      {
		declare rss, xt, xsl any;
		rss := http_get_string_output ();
		xt := xml_tree_doc (rss);
		http_rewrite ();
		xsl := xslt (filt, xt, vector ('id', upar));
		http_value (xsl, null);
	      }
	    http_header ('Content-Type: text/vnd.wap.wml\r\n');
	    exitp:;
	  }
      }
    return;
  }
;

The rss2wml.xsl style sheet:

<?xml version='1.0'?>

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0"
  xmlns:vb="http://example.com/weblog/">
  <xsl:output method="xml" indent="yes" doctype-public="-//WAPFORUM//DTD WML 1.1//EN" doctype-system="http://www.wapforum.org/DTD/wml_1.1.xml" media-type="text/xml"/>

  <xsl:param name="id" />

  <xsl:template match="/">
    <wml>
      <card
xml:id="card1">
	<xsl:apply-templates />
      </card>
    </wml>
  </xsl:template>

  <xsl:template match="item">
    <xsl:choose>
      <xsl:when test="boolean($id!='')">
	<xsl:if test="substring-after(link,'?') = $id">
	  <p>
	    <xsl:value-of select="vb:tidy_xhtml (string (description), '*default*')"
	      disable-output-escaping="yes"/>
	    <br/>
	    <xsl:if test="preceding-sibling::item">
	      <a>
		<xsl:attribute name="href">rss.xml?<xsl:value-of select="substring-after(preceding-sibling::item/link,'?')"/></xsl:attribute>PREVIOUS</a><br />
	    </xsl:if>
	    <xsl:if test="following-sibling::item">
	      <a>
		<xsl:attribute name="href">rss.xml?<xsl:value-of select="substring-after(following-sibling::item/link,'?')"/></xsl:attribute>NEXT</a>
	    </xsl:if>
	  </p>
	</xsl:if>
      </xsl:when>
      <xsl:otherwise>
	<p>
	  <a>
	    <xsl:attribute name="href">rss.xml?<xsl:value-of select="substring-after(link,'?')"/></xsl:attribute>
	    <xsl:value-of select="title"/>
	  </a>
	</p>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <xsl:template match="text()"/>
</xsl:stylesheet>