Example 15.19. Executing an XML template from the file system

First step is to setup the /xmlt directory on file system. The function vhost_define() will be used to enable execution of XML templates. DBA privileges are required to use this function:

SQL> vhost_define (lpath=>'/xmlt', ppath=>'/xmlt/',
  vsp_user=>'demo', opts=>vector('xml_templates', 'yes'));

Now the following files must be stored as: <www-root>/xmlt/file1.xml

<?xml version ='1.0' encoding='UTF-8'?>
 <root xmlns:sql='urn:schemas-openlink-com:xml-sql' sql:xsl='shippers.xsl'>
   <!-- XML template example -->

   <!-- parameters declaration -->

    <sql:header>
      <sql:param name=":ShipperID">2</sql:param>
      <sql:param name=":CompanyName">United Package (you should see me)</sql:param>
      <sql:param name=":Phone">(503) 555-3199</sql:param>
    </sql:header>
   <!-- XML updategram , this will update the second record -->

    <sql:sync>
        <sql:before>
            <Shippers sql:id="1" ShipperID=":ShipperID"/>
        </sql:before>
        <sql:after>
            <Shippers sql:id="1" ShipperID=":ShipperID" CompanyName=":CompanyName" Phone=":Phone"/>
        </sql:after>
    </sql:sync>
   <!-- make a parametrized query -->

   <sql:query>
      SELECT ShipperID, CompanyName,Phone FROM Shippers where ShipperID = :ShipperID FOR XML AUTO
   </sql:query>
   <!-- make an error to see what happens -->

   <sql:query>
      select * from NotExist for xml auto
   </sql:query>
</root>

Now we want an XSL stylesheet stored as: <www-root>/xmlt/shippers.xslt containing the following:

<?xml version="1.0"?>

<xsl:stylesheet
    version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" indent="yes" />

  <xsl:template match="/">
        <html>
            <head>
            <title>Shippers list</title>
            </head>
            <body>
            <xsl:apply-templates/>
            </body>
        </html>
    </xsl:template>

  <xsl:template match="root">
        <table>
            <tr><td>ID</td><td>Name</td><td>Phone</td></tr>
            <xsl:apply-templates/>
        </table>
    </xsl:template>

  <xsl:template match="Shippers">
        <tr>
            <td><xsl:value-of select="@ShipperID"/></td>
            <td><xsl:value-of select="@CompanyName"/></td>
            <td><xsl:value-of select="@Phone"/></td>
        </tr>
    </xsl:template>
</xsl:stylesheet>

Point your web browser to:

http://[host:port]/xmlt/file1.xml

and then at:

http://[host:port]/xmlt/file1.xml?:ShipperID=3

for the results.


Example 15.20. Executing an XML template from WebDAV

The first step is to create a new DAV collection and configure it to allow XML template execution. DBA privileges are required for these operations. To create a DAV collection the function dav_col_create() can be used, followed by the vhost_define() function to allow XML template execution:

SQL> dav_col_create ('/DAV/xmlt/', '110100100', 'dav', 'dav', 'dav', 'dav');
SQL> vhost_define (lpath=>'/DAV/xmlt', ppath=>'/DAV/xmlt/',
  is_dav=>1, vsp_user=>'demo', opts=>vector('xml_templates', 'yes'));

Now, the file can be uploaded. The same file as in the previous example will be used, copied from the file system location to the DAV location: <www-root>/DAV/xmlt/file1.xml

SQL> dav_res_upload ('/DAV/xmlt/file1.xml',
  file_to_string (concat (http_root(), '/xmlt/file1.xml')), 'text/xml',
  '111101101N', 'dav', 'dav', 'dav', 'dav');

Likewise the XSLT stylesheet from the previous example will also be used in the same way, placing into the DAV location: <www-root>/DAV/xmlt/shippers.xslt

SQL> dav_res_upload ('/DAV/xmlt/shippers.xsl',
  file_to_string (concat (http_root(), '/xmlt/shippers.xsl')),
  'text/xsl', '110100100N', 'dav', 'dav', 'dav', 'dav');

This example can now be demonstrated by trying the following URLs in your web browser:

http://[host:port]/DAV/xmlt/file1.xml

and

http://[host:port]/DAV/xmlt/file1.xml?:ShipperID=3