<!-- -*- 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>