<!-- -*- sgml -*- --> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <meta name="GENERATOR" content="Microsoft FrontPage Express 2.0"> <title>The OpenJade SGML/XML backend</title> </head> <body background="images/background.gif" bgcolor="#FFFFFF"> <p><font face="Geneva, Arial"><img src="images/dsssltitle.gif" alt="OpenJade" vspace="10" width="750" height="60"> </font></p> <div align="center"><center> <table border="0"> <tr> <td><font face="Geneva, Arial"><img src="images/space.gif" alt="" width="145" height="10"></font></td> <td><h1><font face="Geneva, Arial">The OpenJade SGML/XML backend</font></h1> <h3><font face="Arial">Created by James Clark</font></h3> <p><font face="Geneva, Arial">OpenJade does not support the DSSSL Transformation Language. However, it provides some simple, non-standardized extensions to the DSSSL Style Language that allow it to be used for SGML transformations.</font> </p> <p><font face="Geneva, Arial">These extensions are used in conjunction with the SGML backend which is selected with the <samp>-t sgml</samp> or <samp>-t xml</samp> options. Unlike other backends, the SGML backend writes its output to the standard output.</font> </p> <p><font face="Geneva, Arial">The <samp>-t xml</samp> option makes empty elements and processing instructions use the XML syntax. Note that the XML declaration is not automatically emitted.</font> </p> <p><font face="Geneva, Arial">The extensions consist of a collection of flow object classes that are used instead of the standard DSSSL-defined flow object classes:</font> </p> <dl> <dt><font face="Geneva, Arial"><code>element</code></font> </dt> <dt><font face="Geneva, Arial"><code>empty-element</code></font> </dt> <dd><font face="Geneva, Arial">Each of these flow objects results in an element in the output. The <code>element</code> flow object is a compound flow object (one that can have child flow objects). Both a start-tag and an end-tag are generated for this flow object. The <code>empty-element</code> is an atomic flow object (one that cannot have child flow objects). Only a start-tag is output for this. It should should be used for elements with a declared content of EMPTY or with a content reference attribute. Both of these flow objects support the following non-inherited characteristics:</font> <dl> <dt><font face="Geneva, Arial"><code>gi</code></font> </dt> <dd><font face="Geneva, Arial">This is a string-valued characteristic that specifies the element's generic identifier. It defaults to the generic identifier of the current node.</font> </dd> <dt><font face="Geneva, Arial"><code>attributes</code></font> </dt> <dd><font face="Geneva, Arial">This specifies the element's attributes as a list of lists each of which consists of exactly two strings, the first specifying the attribute name and the second the attribute value. It defaults to the empty list.</font> </dd> </dl> </dd> <dd> </dd> <dt><font face="Geneva, Arial"><code>processing-instruction</code></font> </dt> <dd><font face="Geneva, Arial">This is an atomic flow object that results in a processing instruction. It supports the following non-inherited characteristics:</font> <dl> <dt><font face="Geneva, Arial"><code>data</code></font> </dt> <dd><font face="Geneva, Arial">This is a string-valued characteristic that specifies the content of the processing instruction. It defaults to the empty string.</font> </dd> </dl> </dd> <dt><font face="Geneva, Arial"><code>document-type</code></font> </dt> <dd><font face="Geneva, Arial">This is an atomic flow object that results in a DOCTYPE declaration. It supports the following non-inherited characteristics:</font> <dl> <dt><font face="Geneva, Arial"><code>name</code></font> </dt> <dd><font face="Geneva, Arial">This is a string-valued characteristic that specifies the name of the document type (which must be the same as the name of the document element). It must not be omitted.</font> </dd> <dt><font face="Geneva, Arial"><code>system-id</code></font> </dt> <dd><font face="Geneva, Arial">This is a string-valued characteristic that specifies the system identifier of the document type. If non-empty, this will be used as the system identifier in the doctype declaration. The default value is the empty string.</font> </dd> <dt><font face="Geneva, Arial"><code>public-id</code></font> </dt> <dd><font face="Geneva, Arial">This is a string-valued characteristic that specifies the public identifier of the document type. If non-empty, this will be used as the public identifier in the doctype declaration. The default value is the empty string.</font> </dd> </dl> </dd> <dt><font face="Geneva, Arial"><code>entity</code></font> </dt> <dd><font face="Geneva, Arial">This is an compound flow object that stores its content in a separate entity. It supports the following non-inherited characteristic:</font> <dl> <dt><font face="Geneva, Arial"><code>system-id</code></font> </dt> <dd><font face="Geneva, Arial">The system identifier of the entity. For now this is treated as a filename not as an FSI.</font> </dd> </dl> <p><font face="Geneva, Arial">Note that no entity reference or declaration is emitted.</font> </p> </dd> <dt><font face="Geneva, Arial"><code>entity-ref</code></font> </dt> <dd><font face="Geneva, Arial">This is an atomic flow object that results in an entity reference. It supports the following non-inherited characteristic:</font> <dl> <dt><font face="Geneva, Arial"><code>name</code></font> </dt> <dd><font face="Geneva, Arial">The name of the entity.</font> </dd> </dl> </dd> <dt><font face="Geneva, Arial"><code>formatting-instruction</code></font> </dt> <dd><font face="Geneva, Arial">This is an atomic flow object that inserts characters into the output without change. It supports the following non-inherited characteristic:</font> <dl> <dt><font face="Geneva, Arial"><code>data</code></font> </dt> <dd><font face="Geneva, Arial">This is the string to be inserted.</font> </dd> </dl> <p><font face="Geneva, Arial">It differs from normal data characters in the <code>&</code>, <code><</code> and <code>></code> will not be escaped.</font> </p> </dd> </dl> <p><font face="Geneva, Arial">There is also the following characteristic:</font> </p> <dl> <dt><font face="Geneva, Arial"><code>preserve-sdata?</code></font> </dt> <dd><font face="Geneva, Arial">This is an inherited boolean characteristic that applies to character flow objects. When true, if the current-node for the character flow object was an sdata node, then the character will be output as a reference to an entity with the same name. The initial value is #f.</font> </dd> </dl> <p><font face="Geneva, Arial">Each of these flow object classes must be declared using <code>declare-flow-object-class</code> in any DSSSL specification that makes use of it. A suitable set of declarations is:</font> </p> <pre><font face="Geneva, Arial"> (declare-flow-object-class element "UNREGISTERED::James Clark//Flow Object Class::element") (declare-flow-object-class empty-element "UNREGISTERED::James Clark//Flow Object Class::empty-element") (declare-flow-object-class document-type "UNREGISTERED::James Clark//Flow Object Class::document-type") (declare-flow-object-class processing-instruction "UNREGISTERED::James Clark//Flow Object Class::processing-instruction") (declare-flow-object-class entity "UNREGISTERED::James Clark//Flow Object Class::entity") (declare-flow-object-class entity-ref "UNREGISTERED::James Clark//Flow Object Class::entity-ref") (declare-flow-object-class formatting-instruction "UNREGISTERED::James Clark//Flow Object Class::formatting-instruction") (declare-characteristic preserve-sdata? "UNREGISTERED::James Clark//Characteristic::preserve-sdata?" #f) </font></pre> <p><font face="Geneva, Arial">Here's a simple example that does the identity transformation:</font> </p> <pre><font face="Geneva, Arial"> <!doctype style-sheet PUBLIC "-//James Clark//DTD DSSSL Style Sheet//EN"> (declare-flow-object-class element "UNREGISTERED::James Clark//Flow Object Class::element") (define (copy-attributes #!optional (nd (current-node))) (let loop ((atts (named-node-list-names (attributes nd)))) (if (null? atts) '() (let* ((name (car atts)) (value (attribute-string name nd))) (if value (cons (list name value) (loop (cdr atts))) (loop (cdr atts))))))) (default (make element attributes: (copy-attributes))) </font></pre> <p><font face="Geneva, Arial">Note that this does not deal with empty elements nor processing instructions, nor does it include a doctype declaration.</font> </p> </td> </tr> </table> </center></div> <p> </p> </body> </html>