Listing 1 - of_search method

long			ll_rows, ll_index, ll_count
string			ls_xml
datastore	l_source, l_dest

SQLCA.DBMS = "SYC"
SQLCA.Database = "newsgroups"
SQLCA.LogPass = "*******"
SQLCA.ServerName = "newsgroups"
SQLCA.LogId = "********"
SQLCA.AutoCommit = False
SQLCA.DBParm = "Release='12.5'"

CONNECT USING SQLCA;

l_source = CREATE datastore
l_source.DataObject = 'd_search'
l_source.SetTransObject ( SQLCA )
ll_rows = l_source.Retrieve ( product, searchterm, maxresults * 2 )

DISCONNECT USING SQLCA;

IF ll_rows < 0 THEN
	Destroy l_source
	Return ''
END IF

l_dest = CREATE datastore
l_dest.DataObject = l_source.DataObject
l_source.RowsCopy ( startingrow, startingrow + rowstoreturn, Primary!, l_dest, 1, Primary! )
Destroy l_source

ll_count = l_dest.RowCount()
FOR ll_index = 1 TO ll_count
	l_dest.Object.recordnum[ll_index] = startingrow + ( ll_index - 1 )
NEXT

ls_xml = l_dest.Object.DataWindow.Data.XML
Destroy l_dest

Return ls_xml

Listing 2 - of_display method

long			ll_rows
string			ls_xml
datastore	l_source

SQLCA.DBMS = "SYC"
SQLCA.Database = "newsgroups"
SQLCA.LogPass = "*******"
SQLCA.ServerName = "newsgroups"
SQLCA.LogId = "*******"
SQLCA.AutoCommit = False
SQLCA.DBParm = "Release='12.5'"

CONNECT USING SQLCA ;
IF SQLCA.SQLCode <> 0 THEN Return SQLCA.SQLErrText

l_source = CREATE datastore
l_source.DataObject = 'd_message'
l_source.SetTransObject ( SQLCA )
ll_rows = l_source.Retrieve ( '<' + msgid + '>' )

DISCONNECT USING SQLCA ;

IF ll_rows <= 0 THEN
	Destroy l_source
	Return ''
END IF

ls_xml = l_source.Object.DataWindow.Data.XML
Destroy l_source

Return ls_xml

Listing 3 - search.aspx file

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="search.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Newsgroup Search</title>
</head>
<body>
    <h2>Newsgroup Search Results</h2>
    <form id="form1" runat="server">
    <div>
    <asp:Xml id="myXML" runat="server"/>
    </div>
    </form>
</body>
</html>

Listing 4 - display.aspx file

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="display.aspx.cs" Inherits="display" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Newsgroup Search Results</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <asp:XML id="myXML" runat="server" />
    </div>
    </form>
</body>
</html>

Listing 5 - search.aspx.cs file

using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Xml;
using System.Xml.Xsl;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

        XmlDocument mydoc = new XmlDocument();
        XslTransform mytrans = new XslTransform();

        String product = Request.Params["product"];
        String searchterm = Request.Params["searchterm"];
        short maxrows = short.Parse(Request.Params["maxrows"]);
        short startrow = short.Parse(Request.Params["startrow"]);
        short returnrows = short.Parse(Request.Params["returnrows"]);

        net.teamsybase.www.newsgroups newsgroups = new net.teamsyb
        ase.www.newsgroups();
        String xml = newsgroups.search ( product, searchterm,
        maxrows, startrow, returnrows );

        XsltArgumentList xsltArgList = new XsltArgumentList();
        xsltArgList.AddParam("product", "", product);
        xsltArgList.AddParam("searchterm", "", searchterm);
        xsltArgList.AddParam("maxrows", "", maxrows);
        xsltArgList.AddParam("startrow", "", startrow);
        xsltArgList.AddParam("returnrows", "", returnrows);

        mydoc.LoadXml(xml);
        mytrans.Load(Server.MapPath("search.xsl"));

        myXML.Document = mydoc;
        myXML.Transform = mytrans;
        myXML.TransformArgumentList = xsltArgList;

    }

}

Listing 6 - display.aspx.cs

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Xml;
using System.Xml.Xsl;

public partial class display : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        XmlDocument mydoc = new XmlDocument();
        XslTransform mytrans = new XslTransform();

        String msgid = Request.Params["msgid"];

        net.teamsybase.www.newsgroups newsgroups = new net.teamsyb
         ase.www.newsgroups();
        String xml = newsgroups.displaymsg(msgid);

        mydoc.LoadXml(xml);
        mytrans.Load(Server.MapPath("display.xsl"));

        myXML.Document = mydoc;
        myXML.Transform = mytrans;
    }
}

Listing 7 - search.xls file

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet [
  <!ENTITY nbsp " ">
]>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
    xmlns:util="http://www.teamsybase.com/util">
  <xsl:param name="product"/>
  <xsl:param name="searchterm"/>
  <xsl:param name="maxrows"/>
  <xsl:param name="startrow"/>
  <xsl:param name="returnrows"/>
  <xsl:template match="/">
    <xsl:variable name="count" select="count(//search_row)"/>
    <xsl:choose>
      <xsl:when test="$count>0" >
        <xsl:call-template name="links"/>
        <xsl:call-template name="rows"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:choose>
          <xsl:when test="$startrow = 1">
            Your search did not match any newsgroup messages.
          </xsl:when>
          <xsl:otherwise>
            <xsl:call-template name="links"/>
            Your search did not return any further newsgroup messages.
          </xsl:otherwise>
        </xsl:choose>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
  <xsl:template name="rows">
    <table width="100%">
      <xsl:for-each select="//search_row">
        <tr>
          <td>
            <font size="+1">
              <xsl:variable name="msgid" select="util:urlEncode(string(msgid))"/>
              <a href="display.aspx?msgid={$msgid}">
                <xsl:value-of select="subject"/>
              </a>
            </font>
          </td>
        </tr>
        <tr>
          <td width="75%">
            <xsl:value-of select="summary"/>
          </td>
          <td width="25%">
          </td>
        </tr>
        <tr>
          <td>
            <font color="green">
              <xsl:value-of select="groups"/> - <xsl:value-of 
               select="date"/> by <xsl:value-of select="sender"/>
            </font>
          </td>
        </tr>
        <tr>
          <td>
            <br/>
          </td>
        </tr>
      </xsl:for-each>
    </table>
  </xsl:template>
  <xsl:template name="links">
    <xsl:variable name="count" select="count(//search_row)"/>
    <table>
      <tr>
        <td width="20" align="center">
          <a href="search.aspx?product={$product}&searchterm={$se
           archterm}&maxrows={$maxrows}&startrow=1&return
           rows={$returnrows}">First</a>
        </td>
        <xsl:choose>
          <xsl:when test="$startrow > 1" >
            <xsl:variable name="totalpages">
              <xsl:value-of select="floor ( $startrow div $returnrows )"/>
            </xsl:variable>
            <xsl:call-template name="createlinks">
              <xsl:with-param name="currentpage" select="1"/>
              <xsl:with-param name="totalpages" select="$totalpages"/>
            </xsl:call-template>
          </xsl:when>
        </xsl:choose>
        <xsl:if test="$count>0">
          <xsl:choose>
            <xsl:when test="$startrow < $maxrows - $returnrows" >
              <xsl:variable name="newstart" select="$startrow + 
                                 $returnrows"/>
              <td width="20" align="center">
                <a href="search.aspx?product={$product}&search
                  term={$searchterm}&maxrows={$maxrows}&start
                  row={$newstart}&returnrows={$returnrows}">Next</a>
              </td>
            </xsl:when>
          </xsl:choose>
        </xsl:if>
      </tr>
    </table>
    <hr/>
  </xsl:template>
  <xsl:template name="createlinks">
    <xsl:param name="currentpage"/>
    <xsl:param name="totalpages"/>
    <xsl:if test="$currentpage <= $totalpages">
      <xsl:variable name="newstart" select="(($currentpage - 1 ) * 
                          $returnrows) + 1"/>
      <td width="20" align="center">
        <a href="search.aspx?product={$product}&searchterm={$sear
         chterm}&maxrows={$maxrows}&startrow={$newstart}&
         returnrows={$returnrows}">
          <xsl:value-of select="$currentpage"/>
        </a>
      </td>
      <xsl:call-template name="createlinks">
        <xsl:with-param name="currentpage" select="$currentpage + 1"/>
        <xsl:with-param name="totalpages" select="$totalpages"/>
      </xsl:call-template>
    </xsl:if>
  </xsl:template>
  <msxsl:script language="JScript" implements-prefix="util">
    <![CDATA[
    function urlEncode(strURL)
    {
    return encodeURI(strURL.substring (1, strURL.length - 1 ));
    }
    ]]>
  </msxsl:script>
</xsl:stylesheet>

Listing 8 - display.xsl file

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
      <xsl:for-each select="//message_row">
        <table bgcolor="#e0e0e0">
          <tr>
            <td>
              From: <xsl:value-of select="sender"/>
            </td>
          </tr>
          <tr>
            <td>
              Subject: <xsl:value-of select="subject"/>
            </td>
          </tr>
          <tr>
            <td>
              Groups: <xsl:value-of select="groups"/>
            </td>
          </tr>
          <tr>
            <td>
            Date: <xsl:value-of select="date"/>
            </td>
          </tr>
        </table>
        <pre>
          <xsl:value-of select="text"/>
        </pre>
      </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>