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>