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);
                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');

The rss2wml.xsl style sheet:

<?xml version='1.0'?>

  <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="/">
        <xsl:apply-templates />

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

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