<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="stylesheet/xml.dsl" type="text/dsssl"?>
<!-- $Id: WD-xsl-19981216.xml,v 1.1 1998/12/16 15:44:15 quint Exp $ -->
<!DOCTYPE spec SYSTEM "xslspec.dtd" [
<!ENTITY XMLRec "http://www.w3.org/TR/REC-xml">
<!ENTITY XMLNames "http://www.w3.org/TR/WD-xml-names">
<!ENTITY year "1998">
<!ENTITY month "December">
<!ENTITY day "16">
<!ENTITY MMDD "1216">
<!ENTITY D "DSSSL:">
<!ENTITY C "CSS:">
]>
<spec>
<header>
<title>Extensible Stylesheet Language (XSL)</title>
<version>Version 1.0</version>
<w3c-designation>WD-xsl-&year;&MMDD;</w3c-designation>
<w3c-doctype>World Wide Web Consortium Working Draft</w3c-doctype>
<pubdate><day>&day;</day><month>&month;</month><year>&year;</year></pubdate>
<publoc>
<loc href="http://www.w3.org/TR/&year;/WD-xsl-&year;&MMDD;"
          >http://www.w3.org/TR/&year;/WD-xsl-&year;&MMDD;</loc>
<loc href="http://www.w3.org/TR/&year;/WD-xsl-&year;&MMDD;.xml"
          >http://www.w3.org/TR/&year;/WD-xsl-&year;&MMDD;.xml</loc>
<loc href="http://www.w3.org/TR/&year;/WD-xsl-&year;&MMDD;.html"
          >http://www.w3.org/TR/&year;/WD-xsl-&year;&MMDD;.html</loc>
<loc href="http://www.w3.org/TR/&year;/WD-xsl-&year;&MMDD;.pdf"
          >http://www.w3.org/TR/&year;/WD-xsl-&year;&MMDD;.pdf</loc>
</publoc>
<latestloc>
<loc href="http://www.w3.org/TR/WD-xsl"
          >http://www.w3.org/TR/WD-xsl</loc>
</latestloc>
<prevlocs>
<loc href="http://www.w3.org/TR/1998/WD-xsl-19980818"
          >http://www.w3.org/TR/1998/WD-xsl-19980818</loc>
</prevlocs>
<authlist>
<author part="Tree Construction">
<name>James Clark</name>
<email href="mailto:jjc@jclark.com">jjc@jclark.com</email>
</author>
<author part="Formatting Objects">
<name>Stephen Deach</name>
<affiliation>Adobe</affiliation>
<email href="mailto:sdeach@adobe.com">sdeach@adobe.com</email>
</author>
</authlist>

<status>

<p>This is a W3C Working Draft for review by W3C members and other
interested parties. This adds additional functionality to what was
described in the previous draft, however the basic design of the
previous draft remains unchanged.  It is a draft document and may be
updated, replaced, or obsoleted by other documents at any time.  The
XSL Working Group will not allow early implementation to constrain its
ability to make changes to this specification prior to final release.
It is inappropriate to use W3C Working Drafts as reference material or
to cite them as other than <quote>work in progress</quote>. A list of
current W3C working drafts can be found at <loc
href="http://www.w3.org/TR">http://www.w3.org/TR</loc>.</p>

<p>Comments may be sent to <loc
href="mailto:xsl-editors@w3.org">xsl-editors@w3.org</loc>.  Public
discussion of XSL takes place on the <loc
href="http://www.mulberrytech.com/xsl/xsl-list/index.html">XSL-List</loc>
mailing list.</p>

</status>

<abstract>

<p>XSL is a language for expressing stylesheets.  It consists of two
parts:</p>

<olist>

<item><p>a language for transforming XML documents, and</p></item>

<item><p>an XML vocabulary for specifying formatting
semantics.</p></item>

</olist>

<p>An XSL stylesheet specifies the presentation of a class of XML
documents by describing how an instance of the class is transformed
into an XML document that uses the formatting vocabulary.</p>

</abstract>

<langusage>
<language id="EN">English</language>
<language id="ebnf">EBNF</language>
</langusage>
<revisiondesc>
<slist>
<sitem>See RCS log for revision history.</sitem>
</slist>
</revisiondesc>
</header>
<body>
<div1>
<head>Overview</head>

<p>XSL is a language for expressing stylesheets. Each stylesheet
describes rules for presenting a class of XML source documents. There
are two parts to the presentation process. First, the result tree is
constructed from the source tree. Second, the result tree is
interpreted to produce formatted output on a display, on paper, in
speech or onto other media.</p>

<p>The first part, constructing the result tree, is achieved by
associating patterns with templates.  A pattern is matched against
elements in the source tree.  A template is instantiated to create
part of the result tree.  The result tree is separate from the source
tree.  The structure of the result tree can be completely different
from the structure of the source tree. In constructing the result
tree, the source tree can be filtered and reordered, and arbitrary
structure can be added.</p>

<p>The second part, formatting, is achieved by using the formatting
vocabulary specified in this document to construct the result tree.
Formally, this vocabulary is an XML namespace.  Each element type in the
vocabulary corresponds to a formatting object class. A formatting
object class represents a particular kind of formatting behavior. For
example, the block formatting object class represents the breaking of
the content of a paragraph into lines.  Each attribute in the
vocabulary corresponds to a formatting property.  A formatting object
class has a specific set of formatting properties which provide finer
control over the behavior of the formatting object class; for example,
controlling indenting of lines, spacing between lines, and spacing
before and after the collection of lines.  A formatting object can
have content, and its formatting behavior is applied to its
content.</p>

<p>XSL does not require result trees to use the formatting vocabulary
and thus can be used for general XML transformations.  For example,
XSL can be used to transform XML to <quote>well-formed</quote> HTML,
that is, XML that uses the element types and attributes defined by
HTML.</p>

<p>When the result tree uses the formatting vocabulary, a conforming
XSL implementation must be able to interpret the result tree according
to the semantics of the formatting vocabulary as defined in this
document; it may also be able to externalize the result tree as XML,
but it is not required to be able to do so.</p>

<p>This document does not specify how a stylesheet is associated with
an XML document.  It is recommended that XSL processors support the
mechanism described in <bibref ref="XMLSTYLE"/>.</p>

</div1>

<div1>
<head>Tree Construction</head>

<div2>
<head>Overview</head>

<p>A stylesheet contains a set of template rules.  A 
template rule has two parts: a pattern which is matched against nodes
in the source tree and a template which can be instantiated
to form part of the result tree.  This allows a stylesheet to be applicable to
a wide class of documents that have similar source tree
structures.</p>

<p>A template is instantiated for a particular source element
to create part of the result tree. A template can contain elements
that specify literal result element structure.  A template can also
contain elements that are instructions for creating result tree
fragments.  When a template is instantiated, each instruction is
executed and replaced by the result tree fragment that it creates.
Instructions can select and process descendant elements.  Processing a
descendant element creates a result tree fragment by finding the
applicable template rule and instantiating its template. Note
that elements are only processed when they have been selected by the
execution of an instruction.  The result tree is constructed by
finding the template rule for the root node and instantiating
its template.</p>

<p>In the process of finding the applicable template rule, more
than one template rule may have a pattern that matches a given
element. However, only one template rule will be applied. The
method for deciding which template rule to apply is described
in <specref ref="conflict"/>.</p>

<p>XSL uses XML namespaces <bibref ref="XMLNAMES"/> to distinguish
elements that are instructions to the XSL processor from elements that
specify literal result tree structure.  Instruction elements all
belong to the XSL namespace.  The examples in this document use a
prefix of <code>xsl:</code> for elements in the XSL namespace.</p>

<p>An XSL stylesheet contains an <code>xsl:stylesheet</code> document
element.  This element may contain <code>xsl:template</code> elements
specifying template rules, which will be described later in
this document.</p>

<p>The following is an example of a simple XSL stylesheet that
constructs a result tree for a sequence of <code>para</code> elements.
The <code>result-ns="fo"</code> attribute indicates that a tree using
the formatting object vocabulary is being constructed. The rule for
the root node specifies the use of a page sequence formatted with any
font with serifs. The <code>para</code> elements become
<code>block</code> formatting objects which are set in 10 point type
with a 12 point space before each block.</p>

<eg><![CDATA[<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/TR/WD-xsl"
  xmlns:fo="http://www.w3.org/TR/WD-xsl/FO"
  result-ns="fo">
  <xsl:template match="/">
    <fo:basic-page-sequence font-family="serif">
       <xsl:apply-templates/>
    </fo:basic-page-sequence>
  </xsl:template>
  
  <xsl:template match="para">
    <fo:block font-size="10pt" space-before="12pt">
      <xsl:apply-templates/>
    </fo:block>
  </xsl:template>
</xsl:stylesheet>]]></eg>

<p>The <code>xsl:stylesheet</code> element can also contain elements
importing other XSL stylesheets, elements defining macros, elements
defining global constants, and elements identifying source attributes
as individual element identifiers.</p>

</div2>

<div2>
<head>Stylesheet Structure</head>

<p>A stylesheet is represented by an <code>xsl:stylesheet</code>
element in an XML document.</p>

<p>XSL processors must use the XML namespaces mechanism <bibref
ref="XMLNAMES"/> for both source documents and stylesheets.  All XSL
defined elements, that is those specified in this document with a
prefix of <code>xsl:</code>, will only be recognized by the XSL
processor if they belong to a namespace with the URI
<code>http://www.w3.org/TR/WD-xsl</code>; XSL defined elements are
recognized only in the stylesheet not in the source document.</p>

<issue id="issue-versioning"><p>Should there be some way for a
stylesheet to indicate which version of XSL it conforms to?  Can this
be done through the URI of the XSL namespace?</p></issue>

<p>The <code>xsl:stylesheet</code> element has an optional
<code>result-ns</code> attribute; the value must be a namespace
prefix.  If this attribute is specified, all result elements must
belong to the namespace identified by this prefix (the <term>result
namespace</term>).  If there is a namespace declared as the default
namespace, then an empty string may be used as the value to specify
that the default namespace is the result namespace. If the
<code>result-ns</code> attribute specifies the XSL Formatting Objects
namespace, then in addition to constructing the result XML tree, the
XSL processor must interpret it according to the semantics defined in
this document.  The XSL Formatting Objects namespace has the URI
<code>http://www.w3.org/TR/WD-xsl/FO</code>.  The examples in this
document use the <code>fo:</code> prefix for this namespace.</p>

<note><p>If an implementation wishes to use something in the result
tree or stylesheet to control the output of a non-XML representation
of the result tree, it should use the result namespace.  In
particular, if it wishes to make use of something in the result tree
or stylesheet to indicate that the result tree should be output as
HTML that conforms to the HTML 4.0 Recommendation rather than as XML,
it should use a result namespace of
<code>http://www.w3.org/TR/REC-html40</code>; for example,</p>

<eg><![CDATA[
<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/TR/WD-xsl"
  xmlns="http://www.w3.org/TR/REC-html40"
  result-ns="">

<xsl:template match="/">
  <html>
   <xsl:apply-templates/>
  </html>
</xsl:template>

...

</xsl:stylesheet>]]></eg>
</note>

<p>The <code>xsl:stylesheet</code> element may contain the following types
of elements:</p>
<olist>
<item><p><code>xsl:import</code></p></item>
<item><p><code>xsl:include</code></p></item>
<item><p><code>xsl:id</code></p></item>
<item><p><code>xsl:strip-space</code></p></item>
<item><p><code>xsl:preserve-space</code></p></item>
<item><p><code>xsl:macro</code></p></item>
<item><p><code>xsl:attribute-set</code></p></item>
<item><p><code>xsl:constant</code></p></item>
<item><p><code>xsl:template</code></p></item>
</olist>

<p>This example shows the structure of a stylesheet.  Ellipses
(<code>...</code>) indicate where attribute values or content have
been omitted.
Although this example shows one of each type of allowed element,
stylesheets may contain zero or more of each of these elements.</p>

<eg><![CDATA[<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
  <xsl:import href="..."/>

  <xsl:include href="..."/>

  <xsl:id attribute="..."/>

  <xsl:strip-space element="..."/>
  
  <xsl:preserve-space element="..."/>

  <xsl:macro name="...">
   ...
  </xsl:macro>

  <xsl:attribute-set name="...">
  ...
  </xsl:attribute-set>

  <xsl:constant name="..." value="..."/>

  <xsl:template match="...">
    ...
  </xsl:template>
</xsl:stylesheet>]]></eg>

<p>The order in which the children of the <code>xsl:stylesheet</code>
element occur is not significant except for <code>xsl:import</code>
elements and for error recovery.  Users are free to order the elements
as they prefer, and stylesheet creation tools need not provide control
over the order in which the elements occur.</p>

<issue id="issue-media-rule"><p>Should we provide the functionality
of CSS's <code>@media</code> rule and if so how?</p></issue>

</div2>

<div2>
<head>Processing Model</head>

<ednote><edtext>This needs expanding and polishing.</edtext></ednote>

<p>A node is processed to create a result tree fragment.  The
result tree is constructed by processing the root node.  A node is
processed by finding all the template rules with patterns that
match the node, and choosing the best amongst them.  The chosen rule's
template is then instantiated for the node.  <termdef
id="dt-current-node" term="Current Node">During the instantiation of
a template, the node for which the template is being
instantiated is called the current node.</termdef> A template
typically contains instructions that select an additional sequence of
source nodes for processing.  A sequence of source nodes is processed
by appending the result tree structure created by processing each of
the members of the sequence in order.  The process of matching,
instantiation and selection is continued recursively until no new
source nodes are selected for processing.</p>

<p>Implementations are free to process the source document in any way
that produces the same result as if it were processed using this
processing model.</p>

</div2>

<div2 id="data-model">
<head>Data Model</head>

<p>XSL operates on an XML document, whether a stylesheet or a source
document, as a tree.  Any two stylesheets or source documents that
have the same tree will be processed the same by XSL.  The XML
document resulting from the tree construction process is also a tree.
This section describes how XSL models an XML document as a tree.  This
model is conceptual only and does not mandate any particular
implementation.</p>

<p>XML documents operated on by XSL must conform to the XML namespaces
specification <bibref ref="XMLNAMES"/>.</p>

<p>The tree contains nodes.  There are seven kinds of node:</p>

<ulist>

<item><p>root nodes</p></item>

<item><p>element nodes</p></item>

<item><p>text nodes</p></item>

<item><p>attribute nodes</p></item>

<item><p>namespace nodes</p></item>

<item><p>processing instruction nodes</p></item>

<item><p>comment nodes</p></item>

</ulist>

<p>Neither processing instruction nodes nor comment nodes are included
in the tree for the stylesheet.</p>

<p>For every type of node there is a way of determining a string
<term>value</term> for a node of that type.  For some types of node,
the value is part of the node; for other types of node, the value is
computed from the value of descendant nodes.</p>

<issue id="issue-data-entity"><p>Should XSL provide support for
external data entities and notations?</p></issue>

<div3 id="root-node">
<head>Root Node</head>

<p>The root node is the root of the tree.  It does not occur anywhere
else in the tree.  It has a single child which is the element node for
the document element of the document.</p>

<p>The <term>value</term> of the root node is the value of the
document element.</p>

</div3>

<div3 id="element-nodes">
<head>Element Nodes</head>

<p>There is an element node for every element in the document.  An
element has an expanded name consisting of a local name and a possibly
null URI (see <bibref ref="XMLNAMES"/>); the URI will be null if the
element type name has no prefix and there is no default namespace in
scope.</p>

<p>The children of an element node are the element nodes and
characters for its content.  Entity references to both internal and
external entities are expanded.  Character references are
resolved.</p>

<p><termdef id="dt-descendants" term="Descendants">The
<term>descendants</term> of an element node are the character
children, the element node children, and the descendants of the
element node children.</termdef></p>

<p>The <term>value</term> of an element node is the string that
results from concatenating all characters that are <termref
def="dt-descendants">descendants</termref> of the element node in the
order in which they occur in the document.</p>

<p><termdef id="dt-document-order" term="Document Order">The set of
all element nodes in a document can be ordered according to the order
of the start-tags of the elements in the document; this is known as
<term>document order</term>.</termdef></p>

<div4 id="unique-id">
<head>Unique IDs</head>

<p>An element object may have a unique identifier (ID).  This is the
value of the attribute which is declared in the DTD as type
<code>ID</code>.  Since XSL must also work with XML documents that do
not have a DTD, stylesheets may specify which attributes in the source
document should be treated as IDs.  The <code>xsl:id</code> element
has a required <code>attribute</code> attribute, which gives the name
of an attribute in the source document that should be treated as
specifying the element's ID. A stylesheet may contain more than one
<code>xsl:id</code> element, for cases where the source document uses
several attributes as IDs.  An <code>xsl:id</code> element also has an
optional <code>element</code> attribute which specifies the name of an
element type; when the <code>element</code> attribute is specified,
then the <code>xsl:id</code> element specifies that the
<code>attribute</code> attribute of <code>element</code> elements are
treated as IDs.  <code>xsl:id</code> elements may only occur in the
stylesheet body (not within a rule).  The following causes XSL to
treat all <code>name</code> attributes in the source document as
IDs.</p>

<eg><![CDATA[<xsl:id attribute="name"/>]]></eg>

<p>It is an error if, as a consequence of the use of
<code>xsl:id</code>, there is more than one element with the same ID
in the source tree. An XSL processor may signal the error; if it does
not signal the error, it must recover by treating only the first (in
<termref def="dt-document-order">document order</termref>) of the
elements as having that ID.</p>

<issue id="unique-id-content"><p>Should it be possible for a unique id
to be specified in the content of an element instead of in an
attribute?</p></issue>

</div4>

<div4 id="base-uri">

<head>Base URI</head>

<p>An element node also has an associated URI called its base URI
which is used for resolving attribute values that represent relative
URIs into absolute URIs.  If an element occurs in an external entity,
the base URI of that element is the URI of the external entity.
Otherwise the base URI is the base URI of the document.</p>

</div4>

</div3>

<div3 id="attribute-nodes">
<head>Attribute Nodes</head>

<p>Each element node has an associated set of attribute nodes.  A
defaulted attribute is treated the same as a specified attribute.  If
an attribute was declared for the element type, but the default was
declared as <code>#IMPLIED</code>, and the attribute was not specified
on the element, then the element's attribute set does not contain a
node for the attribute.</p>

<p>An attribute node has an expanded name and has a string value.  The
expanded name consists of a local name and a possibly null URI (see
<bibref ref="XMLNAMES"/>); the URI will be null if the specified
attribute name did not have a prefix.  The value is the normalized
value as specified by the XML Recommendation <bibref ref="XML"/>.  An
attribute value whose value is of zero length is not treated
specially.</p>

<p>There are no attribute nodes for attributes that declare namespaces
(see <bibref ref="XMLNAMES"/>).</p>

<issue id="issue-external-dtd"><p>Should we specify something about
how we expect XSL processors to process external DTDs and parameter
entities?  For example, what happens if an attribute default is
declared in an external DTD?</p></issue>

</div3>

<div3 id="namespace-nodes">
<head>Namespace Nodes</head>

<p>Each element has an associated set of namespace nodes, one for each
namespace prefix that is in scope for element and one for the default
namespace if one is in scope for the element.  This means that an
element will have a namespace node:</p>

<ulist>

<item><p>for every attribute on the element whose name starts with
<code>xmlns:</code>;</p></item>

<item><p>for every attribute on an ancestor element whose name starts
<code>xmlns:</code> unless the element itself or a nearer ancestor
redeclares the prefix;</p></item>

<item>

<p>for an <code>xmlns</code> attribute, unless its value is the empty
string.</p>

<note><p>An attribute <code>xmlns=""</code> <quote>undeclares</quote>
the default namespace (see <bibref ref="XMLNAMES"/>).</p></note>

</item>

</ulist>

<p>A namespace node has a name which is a string giving the prefix.
This is empty if the namespace node is for the default namespace.  A
namespace node also has a value which is the namespace URI.  If the
namespace declaration specifies a relative URI, then the resolved
absolute URI is used as the value.</p>

<p>When writing an element node in the result tree out as XML, an XSL
processor must add sufficient namespace-declaring attributes to the
start-tag to ensure that if a tree were recreated from the XML, then
the set of namespace nodes on the element node in the recreated tree
would be equal to or a superset of the set of namespace nodes of the
element node in the result tree.</p>

<note><p>The semantics of a document type may treat parts of attribute
values or data content as namespace prefixes.  The presence of
namespace nodes ensures that the semantics can be preserved when the
tree is written out as XML.</p></note>

</div3>


<div3>
<head>Processing Instruction Nodes</head>

<p>There is a processing instruction node for every processing
instruction.</p>

<ednote><edtext>What about processing instructions in the internal
subset or elsewhere in the DTD?</edtext></ednote>

<p>A processing instruction has a name.  This is a string equal to
the processing instruction's target.  It also has a value.  This is a
string equal to the part of the processing instruction following the
target and any whitespace.  It does not include the terminating
<code>?&gt;</code>.</p>

</div3>

<div3>
<head>Comment Nodes</head>

<p>There is a comment node for every comment.</p>

<ednote><edtext>What about comments in the internal subset or
elsewhere in the DTD?</edtext></ednote>

<p>A comment has a value.  This is a string equal to the text of the
comment not including the opening <code>&lt;!--</code> or the closing
<code>--&gt;</code>.</p>

</div3>

<div3>
<head>Text Nodes</head>

<p>Character data is grouped into text nodes.  As much character data
as possible is grouped into each text node: a text node never has an
immediately following or preceding sibling that is a text node.  The
value of a text node is the character data.</p>

<p>Each character within
a CDATA section is treated as character data.  Thus
<code>&lt;![CDATA[&lt;]]&gt;</code> in the source document will
treated the same as <code>&amp;lt;</code>.  Characters inside comments
or processing instructions are not character data. Line-endings in
external entities are normalized to #xA as specified in the XML
Recommendation <bibref ref="XML"/>.</p>

</div3>

<div3 id="strip">
<head>Whitespace Stripping</head>

<p>After the tree has been constructed, but before it is otherwise
processed by XSL, some text nodes may be stripped.  The
stripping process takes as input a set of element types for which
whitespace must be preserved.  The stripping process is applied to
both stylesheets and source documents, but the set of
whitespace-preserving element types is determined differently for
stylesheets and for source documents.</p>

<p>A text node is preserved if any of the following apply:</p>

<ulist>

<item><p>The element type of the parent of the text node is in the set
of whitespace-preserving element types.</p></item>

<item><p>The text node contains at least one non-whitespace character.
As in XML, a whitespace character is #x20, #x9, #xD or #xA.</p></item>

<item><p>An ancestor element of the text node has an
<code>xml:space</code> attribute with a value of
<code>preserve</code>, and no closer ancestor element has
<code>xml:space</code> with a value of
<code>default</code>.</p></item>

</ulist>

<p>Otherwise the text node is stripped.</p>

<p>The <code>xml:space</code> attributes are not stripped from the
tree.</p>

<note><p>This implies that if an <code>xml:space</code> attribute is
specified on a literal result element, it will be included in the
result.</p></note>

<p>For stylesheets, the set of whitespace-preserving element types
consists of just <code>xsl:text</code><!-- and <code>fo:text</code>-->.</p>

<!--<note><p><code>fo:text</code> is a formatting object that can contain
only characters.  Whereas characters outside <code>fo:text</code> are
subject to the XSL-defined whitespace-related formatting properties
(such as collapsing adjacent whitespace characters) in the same way as
characters in the source document, whitespace characters occurring in
<code>fo:text</code> will not be collapsed or stripped by the
formatter.</p></note>-->

<p>For source documents, the set of whitespace-preserving element
types is determined using the stylesheet as follows:</p>

<ulist>

<item><p>If the <code>xsl:stylesheet</code> element specifies a
<code>default-space</code> attribute with a value of
<code>strip</code>, then the set is initially empty.  Otherwise the
set initially contains all element types that occur in the
document.</p></item>

<item><p>The <code>xsl:strip-space</code> element causes an element
type to be removed from the set of whitespace-preserving element types.
The <code>element</code> attribute gives the name of the element
type.</p></item>

<item><p>The <code>xsl:preserve-space</code> element causes an element
type to be added to the set whitespace-preserving element types. The
<code>element</code> attribute gives the name of the element
type.</p></item>

</ulist>

<issue id="issue-declare-multiple-elements"><p>Should the value of the
<code>element</code> attribute of <code>xsl:strip-space</code>,
<code>xsl:preserve-space</code> and <code>xsl:id</code> be a list of
element type names (and thus be renamed to <code>elements</code>)?  If
so, should the <code>attribute</code> attribute of <code>xsl:id</code>
also be a list of attribute names?</p></issue>

<ednote><edtext>Clarify how these declarations interact with each
other and with xsl:import.</edtext></ednote>

<p>The <code>xsl:stylesheet</code> element can include an
<code>indent-result</code> attribute with values <code>yes</code> or
<code>no</code>.  If the stylesheet specifies
<code>indent-result="yes"</code>, then the XSL processor may add
whitespace to the result tree (possibly based on whitespace stripped
from either the source document or the stylesheet) in order to indent
the result nicely; if <code>indent-result="no"</code>, it must not add
any whitespace to the result.  When adding whitespace with
<code>indent-result="yes"</code>, the XSL processor can use any
algorithm provided that the result is the same as the result with
<code>indent-result="no"</code> after whitespace is stripped from both
using the process described with the set of whitespace-preserving
element types consisting of just <code>xsl:text</code><!-- and
<code>fo:text</code>-->.</p>

</div3>

</div2>

<div2>
<head>Template Rules</head>

<p>A template rule is specified with the <code>xsl:template</code>
element. The <code>match</code> attribute identifies the source node
or nodes to which the rule applies. The content of the
<code>xsl:template</code> element is the template.</p>

<p>For example, an XML document might contain:</p>

<eg><![CDATA[This is an <emph>important</emph> point.]]></eg>

<p>The following template rule matches elements of type
<code>emph</code> and has a template which produces a
<code>fo:inline-sequence</code> formatting object with a
<code>font-weight</code> property of <code>bold</code>.</p>

<eg><![CDATA[<xsl:template match="emph">
  <fo:inline-sequence font-weight="bold">
    <xsl:apply-templates/>
  </fo:inline-sequence>
</xsl:template>
]]></eg>

<p>As described later, the <code>xsl:apply-templates</code> element
recursively processes the children of the source element.</p>

<div3 id="conflict">
<head>Conflict Resolution for Template Rules</head>

<p>It is possible for a source node to match more than one 
template rule. The template rule to be used is determined as
follows:</p>

<olist>

<item><p>First, all matching template rules that are less
<termref def="dt-important">important</termref> than the most
important matching template rule or rules are eliminated from
consideration.</p></item>

<item><p>Next, all matching template rules that have a lower priority
than the matching template rule or rules with the highest priority are
eliminated from consideration.  The priority of a rule is specified by
the <code>priority</code> attribute on the rule.  The value of this
must be a real number (positive or negative).  The default priority is
0.</p>

<ednote><edtext>Say exactly what syntax is allowed for real
numbers.</edtext></ednote>

<issue id="issue-default-priority"><p>Should there be a more
complicated way of calculating the default priority?  For example, -1
for <code>*</code>, 0 for just an element type name, and 1 for more
complex patterns.</p></issue>

</item>

</olist>

<p>It is an error if this leaves more than one matching template
rule.  An XSL processor may signal the error; if it does not signal
the error, it must recover by choosing from amongst the matching
template rules that are left the one that occurs last in the
stylesheet.</p>

</div3>

<div3>
<head>Built-in Template Rules</head>

<p>There is a built-in template rule to allow recursive processing to
continue in the absence of a successful pattern match by an explicit
rule in the stylesheet.  This rule applies to both element nodes and
the root node.  The following shows the equivalent of the built-in
template rule:</p>

<eg><![CDATA[<xsl:template match="*|/">
  <xsl:apply-templates/>
</xsl:template>]]></eg>

<p>There is also a built-in template rule for text nodes that copies
text through:</p>

<eg><![CDATA[<xsl:template match="text()">
  <xsl:value-of select="."/>
</xsl:template>]]></eg>

<p>The built-in rule does not apply to processing instructions and
comments.  When a comment or processing instruction is processed, and
no rule is matched, nothing is created.</p>

<p>The built-in template rules are treated as if they were imported
implicitly before the stylesheet and so are considered less <termref
def="dt-important">important</termref> than all other template rules.
Thus the author can override a built-in rule by including an
explicit rule with <code>match="*|/"</code> or
<code>match="text()"</code>.</p>

</div3>
</div2>

<div2>
<head>Patterns</head>

<div3>
<head>Introduction</head>

<p>This section introduces the syntax and semantics of XSL patterns.
The formal, definitive specification is in the following section.</p>

<p>A pattern is a string which selects a set of nodes in a source
document.  The selection is relative to the current node.  The
simplest pattern is an element type name; it selects all the child
elements of the current node with that element type name.  For
example, the pattern <code>chapter</code> selects all the chapter
child elements of the current node.</p>

<p>A pattern can also be matched against a node.  If a node could be
selected by a pattern, then the node is considered to match the
pattern.  More precisely, for any pattern and any document there is a
matching set of nodes; this is the union, for each node in the
document, of the set of nodes selected by the pattern with that node
as the current node.  For example, a pattern <code>chapter</code>
matches any chapter element because if the current node was the parent
of the chapter element, the chapter element would be one of the nodes
selected by the pattern <code>chapter</code>.  This includes the case
where the <code>chapter</code> element is the document element,
because the root node is the parent of the document element.</p>

<p>The <code>|</code> operator can be used to express alternatives.
For example, the pattern <code>emph|b</code> matches both
<code>emph</code> elements and <code>b</code> elements.</p>

<p>Patterns can be composed together with the <code>/</code> operator
in a path-like manner.  For example, a pattern
<code>chapter/section</code> selects the <code>chapter</code> child
elements of the current node, and then for each selected
<code>chapter</code> element, selects the <code>section</code>
children; in other words, it selects the <code>section</code>
grandchildren of the current node that have <code>chapter</code>
parents.  A node would match a pattern <code>chapter/section</code> if
it was a <code>section</code> element with a <code>chapter</code>
parent.</p>

<p><code>/</code> binds more tightly than <code>|</code>.  Thus the
pattern <code>ol/li|ul/li</code> matches <code>li</code> elements that
have an <code>ol</code> or <code>ul</code> parent.</p>

<p>Whitespace can be used around operators in patterns to improve
readability.  Thus <code>ol/li|ul/li</code> can be written as
<code>ol/li | ul/li</code>.</p>

<p><code>*</code> can be used instead of an element type name as a
wildcard.  For example, a pattern <code>*</code> would select all
element children of the current node; a pattern <code>*/section</code>
would select all <code>section</code> grandchildren of the current
node.  A pattern <code>chapter/*</code> would match any element that
has a <code>chapter</code> parent.</p>

<p>A <code>//</code> can be used instead of <code>/</code> to select
from descendants instead of from children.  For example, a pattern
<code>chapter//p</code> selects all the <code>p</code> descendants of
<code>chapter</code> children of the current node, and it matches all
<code>p</code> elements that have a <code>chapter</code> ancestor.</p>

<p>A pattern <code>.</code> selects the current node.  This is useful
with <code>//</code>.  For example, <code>.//div</code> selects all
<code>div</code> descendant elements of the current node.</p>

<p>Similarily <code>..</code> selects the parent of the current node.
For example, <code>../item</code> selects the <code>item</code>
sibling elements of the current node.</p>

<p>Other types of node are treated in a similar way to elements.</p>

<ulist>

<item><p>The attributes of an element are treated like the child
elements; an attribute is distinguished from a child element by
prefixing its name with <code>@</code>.  For example,
<code>@date</code> will select the <code>date</code> attribute of the
current element; <code>employee/@salary</code> will select the
<code>salary</code> attribute of each <code>employee</code> child
element of the current node.  A wildcard <code>@*</code> is allowed
just as with elements; a pattern <code>@*</code> selects all
attributes of the current node.</p></item>

<item><p>A pattern <code>comment()</code> selects all comment children
of the current node. Thus a pattern <code>comment()</code> will match
any comment node.</p></item>

<item><p>A pattern <code>pi()</code> selects all processing
instruction children of the current node.  An argument can be used to
specify the target.  Thus <code>pi("xml-stylesheet")</code> matches
any processing instruction with a target <code>xml-stylesheet</code>.
Note that the argument must be quoted.</p></item>

</ulist>

<p>The set of nodes selected by a pattern can be refined by following
the pattern by a test in square brackets (<code>[]</code>).  Each node
in the set is tested.  The result includes only those nodes for which
a test succeeds.  The following are allowed as tests:</p>

<ulist>

<item><p>A pattern can be used a test; the test succeeds if the
pattern selects one or more nodes when the node being tested is the
current node.  For example, a pattern <code>list[@type]</code> matches
a <code>list</code> element with a <code>type</code> attribute; a
pattern <code>book[editor]</code> selects <code>book</code> children
elements of the current node that have at least one
<code>editor</code> child element.</p></item>

<item><p>A pattern can be compared to a string.  For example, a pattern
<code>list[@type="ordered"]</code> would match any list with an
attribute <code>type</code> with value <code>ordered</code>; a pattern
<code>employee[location="USA"]</code> would select
<code>employee</code> children of the current element that have a
<code>location</code> child with value equal to
<code>USA</code>.</p></item>

<item><p>The position of a node relative to its siblings can be
tested.</p>

<ulist>

<item><p><code>first-of-any()</code> succeeds if the node being tested
is the first element child</p></item>

<item><p><code>last-of-any()</code> succeeds if the node being tested
is the last element child</p></item>

<item><p><code>first-of-type()</code> succeeds if the node being
tested is the first element child of its element type</p></item>

<item><p><code>last-of-type()</code> succeeds if the node being
tested is the first element child of its element type</p></item>

</ulist>

</item>

<item><p>A test can be negated using <code>not()</code>.  For example,
<code>list[not(@type)]</code> matches any <code>list</code> element
without a <code>type</code> attribute.</p></item>

<item><p>Tests can be combined with <code>and</code> and
<code>or</code>.  For example,</p>

<eg>back/div[first-of-type() and last-of-type()]</eg>

<p>matches a <code>div</code> element with a <code>back</code> parent,
when it is the only <code>div</code> child of its parent.</p>
</item>

</ulist>

<p>The <code>[]</code> operator binds more tightly than
<code>|</code>.  Thus the pattern
<code>ol|list[@type="ordered"]</code> matches either <code>list</code>
elements with a <code>type</code> attribute with value
<code>ordered</code> or <code>ol</code> elements.</p>

<p>The root node is treated is specially.  A <code>/</code> at the
beginning of a pattern selects the root node (not the document
element).  For example, a pattern that is just <code>/</code> matches
the root node; a pattern <code>/div</code> will match the document
element it is a <code>div</code> element; a pattern <code>/*</code>
will match the document element whatever is.  When a pattern starts
with <code>/</code> the current node is irrelevant.</p>

<p>A pattern can also start with <code>//</code>. <code>//foo</code>
means the same as <code>/.//foo</code>: it selects the
<code>foo</code> descendants of the root node, which implies that it
selects all foo elements. When a pattern starts with <code>//</code>
the current node is irrelevant.</p>

<p>The <code>ancestor</code> function allows selection of an ancestor
of the current node.  The argument is a match pattern.  It selects the
first ancestor of the current node that matches the argument.  For
example, <code>ancestor(chapter)/title</code> will select the
<code>title</code> children of the first ancestor of the current node
that is a <code>chapter</code>.</p>

<p>The <code>id</code> function allows ID references to be followed.
The argument can be a literal string. For example,
<code>id('foo')</code> will select the element with ID
<code>foo</code>; if there is no such element, the empty node set will
be returned.  Multiple whitespace separated IDs are also allowed; this
<code>id('foo bar')</code> would select elements with an ID
<code>foo</code> or <code>bar</code>.  The argument can be a pattern
instead of a literal string; for each node selected by the pattern,
the value of the node is treated as whitespace separated list of ID
references.  For example, if the current node is an element with an
IDREF or IDREFS attribute named <code>ref</code>, then a pattern
<code>id(@ref)</code> would select the elements referenced by the
<code>ref</code> attribute.</p>

<ednote><edtext>Would it be less confusing to call this
idref?</edtext></ednote>

</div3>

<div3>
<head>Syntax and Semantics</head>

<p>An expression is evaluated with respect to a context, which is a
single node.  The result of evaluating an expression is a set of nodes
or a boolean.</p>

<p>In the following grammar, the nonterminal <xnt
href="&XMLNames;#NT-QName">QName</xnt> is defined in <bibref
ref="XMLNAMES"/>, and <xnt href="&XMLRec;#NT-S">S</xnt> is defined in
<bibref ref="XML"/>.</p>

<scrap>
<head>Selecting</head>
<prod id="NT-SelectExpr">
<lhs>SelectExpr</lhs>
<rhs><nt def="NT-UnionExpr">UnionExpr</nt></rhs>
</prod>
</scrap>

<p><termdef id="dt-select-pattern" term="Select Pattern">A
<term>select pattern</term> must match the production for <nt
def="NT-SelectExpr">SelectExpr</nt>; it returns the list of nodes that
results from evaluating the <nt def="NT-SelectExpr">SelectExpr</nt>
with the current node as context; the nodes are in the list are in
<termref def="dt-document-order">document
order</termref>.</termdef></p>

<scrap>
<head>Matching</head>
<prod id="NT-MatchExpr">
<lhs>MatchExpr</lhs>
<rhs><nt def="NT-SelectExpr">SelectExpr</nt></rhs>
</prod>
</scrap>

<p><termdef id="dt-match-pattern" term="Match Pattern">A <term>match
pattern</term> must match the production for <nt
def="NT-MatchExpr">MatchExpr</nt>; a node matches the match pattern if
the <nt def="NT-MatchExpr">MatchExpr</nt> returns true when evaluated
with that node as context.</termdef></p>

<p>The result of the <nt def="NT-MatchExpr">MatchExpr</nt> is true if,
for any node in the document that contains the context of the <nt
def="NT-MatchExpr">MatchExpr</nt>, the result of evaluating the <nt
def="NT-SelectExpr">SelectExpr</nt> with that node as context contains
the context of the <nt def="NT-MatchExpr">MatchExpr</nt>.  Otherwise
the result is false.</p>

<note><p>A practical implementation needs to provide direct support
for evaluating a pattern as a <nt def="NT-MatchExpr">MatchExpr</nt>,
rather than supporting it indirectly in terms of the equivalent <nt
def="NT-SelectExpr">SelectExpr</nt> semantics.  For example, to test
whether a node matches a pattern <code>foo</code>, an implementation
should not evaluate the pattern <code>foo</code> as a select pattern
with each node in the source document as context, rather it should
simply check whether the node is an element of type <code>foo</code>;
to test whether a node matches a pattern <code>foo//bar</code> is
should check whether the node is an element of type <code>bar</code>
with an ancestor element of type <code>foo</code>.</p></note>

<scrap>
<head>Unions</head>
<prod id="NT-UnionExpr">
<lhs>UnionExpr</lhs>
<rhs><nt def="NT-PathExpr">PathExpr</nt></rhs>
<rhs>| ( <nt def="NT-PathExpr">PathExpr</nt> '|' <nt def="NT-UnionExpr">UnionExpr</nt>)</rhs>
</prod>
</scrap>

<p>The context of the right hand side expressions is the context of
the left hand side expression.  The results of the right hand side
expressions are node sets.  The result of the left hand side <nt
def="NT-UnionExpr">UnionExpr</nt> is the union of the results of the
right hand side expressions.</p>

<scrap>
<head>Paths</head>
<prod id="NT-PathExpr">
<lhs>PathExpr</lhs>
<rhs><nt def="NT-AbsolutePathExpr">AbsolutePathExpr</nt></rhs>
<rhs>| <nt def="NT-ComposeExpr">ComposeExpr</nt></rhs>
</prod>
</scrap>

<p>The context of the right hand side expressions is the context of
the left hand side expression.  The result of the left hand side is
the result of the right hand side.  The result is a node set.</p>

<scrap>
<head>Absolute Paths</head>
<prod id="NT-AbsolutePathExpr">
<lhs>AbsolutePathExpr</lhs>
<rhs>'/' <nt def="NT-SubtreeExpr">SubtreeExpr</nt>?</rhs>
</prod>
</scrap>

<p>If the <nt def="NT-SubtreeExpr">SubtreeExpr</nt> is present, then
the context for the <nt def="NT-SubtreeExpr">SubtreeExpr</nt> is the
root node, and the result is the result of the <nt
def="NT-SubtreeExpr">SubtreeExpr</nt>.  Otherwise the result is the
root node.</p>

<scrap>
<head>Subtrees</head>
<prod id="NT-SubtreeExpr">
<lhs>SubtreeExpr</lhs>
<rhs>'/'? <nt def="NT-ComposeExpr">ComposeExpr</nt></rhs>
</prod>
</scrap>

<p>If the <code>/</code> is present, then the result <nt
def="NT-SubtreeExpr">SubtreeExpr</nt> is the union, for each node in
the subtree rooted at the context of the <nt
def="NT-SubtreeExpr">SubtreeExpr</nt>, of the result of evaluating the
<nt def="NT-ComposeExpr">ComposeExpr</nt> with that node as context.
Otherwise the <nt def="NT-SubtreeExpr">SubtreeExpr</nt> is equivalent
to <nt def="NT-ComposeExpr">ComposeExpr</nt>.</p>

<scrap>
<head>Composition</head>
<prod id="NT-ComposeExpr">
<lhs>ComposeExpr</lhs>
<rhs><nt def="NT-FilterExpr">FilterExpr</nt></rhs>
<rhs>| (<nt def="NT-FilterExpr">FilterExpr</nt> '/' <nt def="NT-SubtreeExpr">SubtreeExpr</nt>)</rhs>
</prod>
</scrap>

<p>The context of the <nt def="NT-FilterExpr">FilterExpr</nt> is the
context of the <nt def="NT-ComposeExpr">ComposeExpr</nt>.  If the <nt
def="NT-SubtreeExpr">SubtreeExpr</nt> is present, then, for each node
in the result of the <nt def="NT-FilterExpr">FilterExpr</nt>, the <nt
def="NT-SubtreeExpr">SubtreeExpr</nt> is evaluated with that node as
the context; the result of the <nt def="NT-ComposeExpr">ComposeExpr</nt>
is the union of the results of evaluating the <nt
def="NT-SubtreeExpr">SubtreeExpr</nt>.  Otherwise the result is the
result of the <nt def="NT-FilterExpr">FilterExpr</nt>.</p>

<scrap>
<head>Filtering</head>
<prod id="NT-FilterExpr">
<lhs>FilterExpr</lhs>
<rhs><nt def="NT-NodeExpr">NodeExpr</nt>
( '[' <nt def="NT-BooleanExpr">BooleanExpr</nt> ']' )?</rhs>
</prod>
</scrap>

<p>The context of the <nt def="NT-NodeExpr">NodeExpr</nt> is the
context of the <nt def="NT-FilterExpr">FilterExpr</nt>.  If the <nt
def="NT-BooleanExpr">BooleanExpr</nt> is present, then for each node
in the result of the <nt def="NT-NodeExpr">NodeExpr</nt>, the <nt
def="NT-BooleanExpr">BooleanExpr</nt> is evaluated with that node as
context; the result consists of those nodes for which the <nt
def="NT-BooleanExpr">BooleanExpr</nt> evaluates to true.</p>

<scrap>
<head>Selecting Nodes</head>
<prod id="NT-NodeExpr">
<lhs>NodeExpr</lhs>
<rhs><nt def="NT-SubNodeExpr">SubNodeExpr</nt></rhs>
<rhs>| <nt def="NT-OtherNodeExpr">OtherNodeExpr</nt></rhs>
</prod>
<prod id="NT-SubNodeExpr">
<lhs>SubNodeExpr</lhs>
<rhs><nt def="NT-ElementExpr">ElementExpr</nt></rhs>
<rhs>| <nt def="NT-AttributeExpr">AttributeExpr</nt></rhs>
<rhs>| <nt def="NT-TextExpr">TextExpr</nt></rhs>
<rhs>| <nt def="NT-CommentExpr">CommentExpr</nt></rhs>
<rhs>| <nt def="NT-PiExpr">PiExpr</nt></rhs>
</prod>
<prod id="NT-OtherNodeExpr">
<lhs>OtherNodeExpr</lhs>
<rhs><nt def="NT-IdExpr">IdExpr</nt></rhs>
<rhs>| <nt def="NT-AncestorExpr">AncestorExpr</nt></rhs>
<rhs>| <nt def="NT-AncestorOrSelfExpr">AncestorOrSelfExpr</nt></rhs>
<rhs>| <nt def="NT-IdentityExpr">IdentityExpr</nt></rhs>
<rhs>| <nt def="NT-ParentExpr">ParentExpr</nt></rhs>
</prod>
</scrap>

<p>The context of the right hand side expressions is the context of
the left hand side expression.  The results of the right hand side
expressions are node sets.  The result of the left hand side is the
result of the left hand side expression.</p>

<issue id="issue-multiple-sources"><p>Should it be possible for
patterns to select nodes in documents other than the source
document?</p></issue>

<issue id="issue-sibling-qual"><p>Should there be qualifiers that
constrain an element to have an immediately preceding or following
sibling of a particular type?</p></issue>

<scrap>
<head>Elements</head>
<prod id="NT-ElementExpr">
<lhs>ElementExpr</lhs>
<rhs><xnt href="&XMLNames;#NT-QName">QName</xnt></rhs>
<rhs>| '*'</rhs>
</prod>
</scrap>

<p>If <code>*</code> is specified, then the result is the child
elements of the context of the <nt
def="NT-ElementExpr">ElementExpr</nt>.  Otherwise, the result is the
set of all elements that are the children of the context of <nt
def="NT-ElementExpr">ElementExpr</nt> and whose name is equal to <xnt
href="&XMLNames;#NT-QName">QName</xnt>.</p>

<p>When comparing the name of an element to a <xnt
href="&XMLNames;#NT-QName">QName</xnt>, the <xnt
href="&XMLNames;#NT-QName">QName</xnt> is expanded into a local name
and a possibly null URI.  This expansion is done in the same way as
for element type names in start and end-tags except that the
default namespace declared with <code>xmlns</code> is not used: if the
<xnt href="&XMLNames;#NT-QName">QName</xnt> does not have a prefix,
then the URI is null (this is the same way attribute names are
expanded).  The expanded element type names are compared (see
<specref ref="element-nodes"/>).</p>

<issue id="issue-pattern-namespace-wildcards"><p>Should patterns of
the form <code>foo:*</code> or <code>*:foo</code> be allowed?  If so,
should <code>*</code> match any element or any element without a
namespace URI?</p></issue>

<scrap>
<head>Attributes</head>
<prod id="NT-AttributeExpr">
<lhs>AttributeExpr</lhs>
<rhs>('@' <xnt href="&XMLNames;#NT-QName">QName</xnt>)</rhs>
<rhs>| ('@' '*')</rhs>
</prod>
</scrap>

<p>If <code>*</code> is specified, the result is the set of attribute
nodes of the context of the <nt
def="NT-AttributeExpr">AttributeExpr</nt>.  If a <xnt
href="&XMLNames;#NT-QName">QName</xnt> is specified, the result is the
attribute node of the context of the <nt
def="NT-AttributeExpr">AttributeExpr</nt> named <xnt
href="&XMLNames;#NT-QName">QName</xnt>, or the empty node set if there
is no such attribute node.  When matching attribute names, the
expanded names are compared (see <specref
ref="attribute-nodes"/>). The <xnt
href="&XMLNames;#NT-QName">QName</xnt> is expanded in the same way as
a <xnt href="&XMLNames;#NT-QName">QName</xnt> in an <nt
def="NT-ElementExpr">ElementExpr</nt>.</p>

<issue id="issue-attribute-qual-case"><p>Do we need to be able
to match attributes in a case insensitive way?</p></issue>

<scrap>
<head>Processing Instructions</head>
<prod id="NT-PiExpr">
<lhs>PiExpr</lhs>
<rhs>'pi' '(' <nt def="NT-Literal">Literal</nt>? ')'</rhs>
</prod>
</scrap>

<p>If the <nt def="NT-Literal">Literal</nt> is present, the result is
the set of processing instruction nodes which are children of the
context of the <nt def="NT-PiExpr">PiExpr</nt> and whose target is
equal to the value of <nt def="NT-Literal">Literal</nt>.  Otherwise
the result is the set of processing instruction nodes which are
children of the context of the <nt def="NT-PiExpr">PiExpr</nt>.</p>

<scrap>
<head>Text</head>
<prod id="NT-TextExpr">
<lhs>TextExpr</lhs>
<rhs>'text' '(' ')'</rhs>
</prod>
</scrap>

<p>The result is the set of all text nodes whose parent is a node in
the context of the <nt def="NT-TextExpr">TextExpr</nt>.</p>

<issue id="issue-regex"><p>Should XSL support regular
expressions for matching against any or all of pcdata content,
attribute values, attribute names, element type names?</p></issue>


<scrap>
<head>Comments</head>
<prod id="NT-CommentExpr">
<lhs>CommentExpr</lhs>
<rhs>'comment' '(' ')'</rhs>
</prod>
</scrap>

<p>The result is the set of all comment nodes which are children of
the context of the <nt def="NT-CommentExpr">CommentExpr</nt>.</p>

<scrap>
<head>IDs</head>
<prod id="NT-IdExpr">
<lhs>IdExpr</lhs>
<rhs><nt def="NT-ConstantIdExpr">ConstantIdExpr</nt></rhs>
<rhs>| <nt def="NT-VariableIdExpr">VariableIdExpr</nt></rhs>
</prod>
<prod id="NT-ConstantIdExpr">
<lhs>ConstantIdExpr</lhs>
<rhs>'id' '(' <nt def="NT-Literal">Literal</nt> ')'</rhs>
</prod>
<prod id="NT-VariableIdExpr">
<lhs>VariableIdExpr</lhs>
<rhs>'id' '(' <nt def="NT-SelectExpr">SelectExpr</nt> ')'</rhs>
</prod>
</scrap>

<p>The context of the <nt def="NT-SelectExpr">SelectExpr</nt> is the
context of the <nt def="NT-IdExpr">IdExpr</nt>.  A set of names is
computed from the argument as follows:</p>

<ulist>

<item><p>If it is a <nt def="NT-ConstantIdExpr">ConstantIdExpr</nt>,
then the value of the <nt def="NT-Literal">Literal</nt> is treated as
a whitespace-separated list of names; the set of names consists of the
members of the list.</p></item>

<item><p>Otherwise, the value of each node in the result of the <nt
def="NT-SelectExpr">SelectExpr</nt> is treated as a
whitespace-separated list of names; the set of names is the union for
each node of the members of the list.</p></item>

</ulist>

<p>The result is the set of element nodes whose ID (see <specref
ref="unique-id"/>) is one of the names in the set of names specified
by the argument.</p>

<issue id="issue-class-attribute"><p>Should there be a way of
specifying that an attribute serves as a class attribute and then
pattern syntax that treats class attributes specially?</p></issue>

<scrap>
<head>Ancestors</head>
<prod id="NT-AncestorExpr">
<lhs>AncestorExpr</lhs>
<rhs>'ancestor' '(' <nt def="NT-MatchExpr">MatchExpr</nt> ')'</rhs>
</prod>
<prod id="NT-AncestorOrSelfExpr">
<lhs>AncestorOrSelfExpr</lhs>
<rhs>'ancestor-or-self' '(' <nt def="NT-MatchExpr">MatchExpr</nt> ')'</rhs>
</prod>
</scrap>

<p>The result of an <nt def="NT-AncestorExpr">AncestorExpr</nt> is the
first ancestor of the context of the <nt
def="NT-AncestorExpr">AncestorExpr</nt> such that <nt
def="NT-MatchExpr">MatchExpr</nt>, when evaluated with that ancestor
as the context, has a result of true.  If there is no such ancestor,
the result is the empty node set.</p>

<p>With <code>ancestor-or-self</code>, a node is treated as the first
of its ancestors.  Thus if the <nt def="NT-MatchExpr">MatchExpr</nt>
evaluates to true with the context of the <nt
def="NT-AncestorOrSelfExpr">AncestorOrSelfExpr</nt>, then the result
of the <nt def="NT-AncestorOrSelfExpr">AncestorOrSelfExpr</nt> is the
context, otherwise the result is the same as the result of an <nt
def="NT-AncestorExpr">AncestorExpr</nt>.</p>


<scrap>
<head>Identity</head>
<prod id="NT-IdentityExpr">
<lhs>IdentityExpr</lhs>
<rhs>'.'</rhs>
</prod>
</scrap>

<p>The result is the context of the <nt
def="NT-IdentityExpr">IdentityExpr</nt>.</p>

<scrap>
<head>Parents</head>
<prod id="NT-ParentExpr">
<lhs>ParentExpr</lhs>
<rhs>'..'</rhs>
</prod>
</scrap>

<p>The result is the parent of the context of the <nt
def="NT-ParentExpr">ParentExpr</nt>.  If the context is the root node,
then the result is the empty node set.</p>

<scrap>
<head>Boolean Expressions</head>
<prod id="NT-BooleanExpr">
<lhs>BooleanExpr</lhs>
<rhs><nt def="NT-AndExpr">AndExpr</nt></rhs>
<rhs>| <nt def="NT-OrExpr">OrExpr</nt></rhs>
<rhs>| <nt def="NT-BooleanPrimaryExpr">BooleanPrimaryExpr</nt></rhs>
</prod>
<prod id="NT-BooleanPrimaryExpr">
<lhs>BooleanPrimaryExpr</lhs>
<rhs><nt def="NT-BooleanGroupExpr">BooleanGroupExpr</nt></rhs>
<rhs>| <nt def="NT-NotExpr">NotExpr</nt></rhs>
<rhs>| <nt def="NT-PositionalExpr">PositionalExpr</nt></rhs>
<rhs>| <nt def="NT-TestExpr">TestExpr</nt></rhs>
<rhs>| <nt def="NT-EqualityExpr">EqualityExpr</nt></rhs>
</prod>
</scrap>

<p>The result of a <nt def="NT-BooleanExpr">BooleanExpr</nt> is true
or false.  The context of the right hand side
expressions is the context of the <nt
def="NT-BooleanExpr">BooleanExpr</nt>.  The result of the <nt
def="NT-BooleanExpr">BooleanExpr</nt> is the result of the right hand
side.</p>

<scrap>
<head>And</head>
<prod id="NT-AndExpr">
<lhs>AndExpr</lhs>
<rhs><nt def="NT-BooleanPrimaryExpr">BooleanPrimaryExpr</nt> ( 'and' <nt def="NT-BooleanPrimaryExpr">BooleanPrimaryExpr</nt> )+</rhs>
</prod>
</scrap>

<p>The context for each <nt
def="NT-BooleanPrimaryExpr">BooleanPrimaryExpr</nt> is the context of
the <nt def="NT-AndExpr">AndExpr</nt>.  The result is true if the
result of all of the <nt
def="NT-BooleanPrimaryExpr">BooleanPrimaryExpr</nt>s is true;
otherwise the result is false.</p>

<scrap>
<head>Or</head>
<prod id="NT-OrExpr">
<lhs>OrExpr</lhs>
<rhs><nt def="NT-BooleanPrimaryExpr">BooleanPrimaryExpr</nt> ( 'or' <nt def="NT-BooleanPrimaryExpr">BooleanPrimaryExpr</nt> )+</rhs>
</prod>
</scrap>

<p>The context for each <nt
def="NT-BooleanPrimaryExpr">BooleanPrimaryExpr</nt> is the context of
the <nt def="NT-OrExpr">OrExpr</nt>.  The result is true if the result
of any of the <nt def="NT-BooleanPrimaryExpr">BooleanPrimaryExpr</nt>s
is true; otherwise the result is false.</p>

<scrap>
<head>Grouping</head>
<prod id="NT-BooleanGroupExpr">
<lhs>BooleanGroupExpr</lhs>
<rhs>'(' <nt def="NT-BooleanExpr">BooleanExpr</nt> ')'</rhs>
</prod>
</scrap>

<p>The result of the left hand side is the result of the right hand
side.  The context of the right hand side is the context of the left
hand side.</p>

<scrap>
<head>Negation</head>
<prod id="NT-NotExpr">
<lhs>NotExpr</lhs>
<rhs>'not' '(' <nt def="NT-BooleanExpr">BooleanExpr</nt> ')'</rhs>
</prod>
</scrap>

<p>The result of the <nt def="NT-NotExpr">NotExpr</nt> is true if the
result of the <nt def="NT-BooleanExpr">BooleanExpr</nt> is false;
otherwise the result is false.</p>

<scrap>
<head>Position</head>
<prod id="NT-PositionalExpr">
<lhs>PositionalExpr</lhs>
<rhs>'first-of-type' '(' ')'</rhs>
<rhs>| 'last-of-type' '(' ')'</rhs>
<rhs>| 'first-of-any' '(' ')'</rhs>
<rhs>| 'last-of-any' '(' ')'</rhs>
</prod>
</scrap>

<p>The context of the <nt def="NT-PositionalExpr">PositionalExpr</nt>
is a single node.</p>

<ulist>

<item><p>For <code>first-of-type()</code>, the result is true if the
context node is an element and the element has no preceding siblings
that are elements with the same element type name, and false
otherwise.</p></item>

<item><p>For <code>first-of-any()</code>, the result is true if the
context node is an element and the element has no preceding siblings
that are elements, and false otherwise.</p></item>

<item><p>For <code>last-of-type()</code>, the result is true if the
context node is an element and the element has no following siblings
that are elements with the same element type name, and false
otherwise.</p></item>

<item><p>For <code>last-of-any()</code>, the result is true if the
context node is an element and the element has no following siblings
that are elements, and false
otherwise.</p></item>

</ulist>

<scrap>
<head>Testing Existence</head>
<prod id="NT-TestExpr">
<lhs>TestExpr</lhs>
<rhs><nt def="NT-SelectExpr">SelectExpr</nt></rhs>
</prod>
</scrap>

<p>The context of the <nt def="NT-SelectExpr">SelectExpr</nt> is the
context of the <nt def="NT-EqualityExpr">EqualityExpr</nt>.  The
result of the <nt def="NT-TestExpr">TestExpr</nt> is true if the
result of the <nt def="NT-SelectExpr">SelectExpr</nt> is non-empty.
Otherwise the result is false.</p>

<scrap>
<head>Equality</head>
<prod id="NT-EqualityExpr">
<lhs>EqualityExpr</lhs>
<rhs><nt def="NT-SelectExpr">SelectExpr</nt> '=' <nt def="NT-Literal">Literal</nt></rhs>
</prod>
</scrap>

<p>The context of the <nt def="NT-SelectExpr">SelectExpr</nt> is the
context of the <nt def="NT-EqualityExpr">EqualityExpr</nt>.  The
result is true if there is a node in the result of the <nt
def="NT-SelectExpr">SelectExpr</nt> whose value is equal to the value
of the <nt def="NT-Literal">Literal</nt>.</p>

<ednote><edtext>We plan to use the data-typing facilities being
developed by the XML Schema WG to allow ordered
comparisons.</edtext></ednote>

<scrap>
<head>Literal</head>
<prod id="NT-Literal">
<lhs>Literal</lhs>
<rhs>'"' [^"]* '"'</rhs>
<rhs>| "'" [^']* "'"</rhs>
</prod>
</scrap>

<p>The value of the <nt def="NT-Literal">Literal</nt> is the sequence
of characters inside the <code>"</code> or <code>'</code>
characters>.</p>

<scrap>
<head>Pattern Lexical Structure</head>
<prod id="NT-PatternToken">
<lhs>PatternToken</lhs>
<rhs>'/' | '@' | '(' | ')' | '|' | '[' | ']' | '=' | '.' | '..' | '*'</rhs>
<rhs>| <xnt href="&XMLNames;#NT-QName">QName</xnt></rhs>
<rhs>| <nt def="NT-OperatorName">OperatorName</nt></rhs>
<rhs>| <nt def="NT-FunctionName">FunctionName</nt></rhs>
<rhs>| <nt def="NT-Literal">Literal</nt></rhs>
</prod>

<prod id="NT-OperatorName">
<lhs>OperatorName</lhs>
<rhs>'and'</rhs>
<rhs>| 'or'</rhs>
</prod>

<prod id="NT-FunctionName">
<lhs>FunctionName</lhs>
<rhs>'id'</rhs>
<rhs>| 'ancestor'</rhs>
<rhs>| 'ancestor-or-self'</rhs>
<rhs>| 'comment'</rhs>
<rhs>| 'pi'</rhs>
<rhs>| 'text'</rhs>
<rhs>| 'not'</rhs>
<rhs>| 'first-of-type'</rhs>
<rhs>| 'last-of-type'</rhs>
<rhs>| 'first-of-any'</rhs>
<rhs>| 'last-of-any'</rhs>
</prod>

<prod id="NT-PatternWhitespace">
<lhs>PatternWhitespace</lhs>
<rhs><xnt href="&XMLRec;#NT-S">S</xnt></rhs>
</prod>
</scrap>

<p>For readability, whitespace may be used in patterns even though not
explicitly allowed by the grammar: <nt
def="NT-PatternWhitespace">PatternWhitespace</nt> may be freely added
within patterns before or after any <nt
def="NT-PatternToken">PatternToken</nt>.</p>

<p>A <nt def="NT-FunctionName">FunctionName</nt> token is recognized
only when the following token is <code>(</code>.  An <nt
def="NT-OperatorName">OperatorName</nt> token is recognized only when
there is a preceding token and the preceding token is not one of
<code>@</code>, <code>/</code>, <code>|</code>, <code>(</code>,
<code>[</code> or an <nt def="NT-OperatorName">OperatorName</nt>.  A
string that is equal to an <nt def="NT-OperatorName">OperatorName</nt>
or a <nt def="NT-FunctionName">FunctionName</nt> can be used in an <nt
def="NT-ElementExpr">ElementExpr</nt> or an <nt
def="NT-AttributeExpr">AttributeExpr</nt>.  For example, <code>and[not
and or]</code> matches a element named <code>and</code> with an
element child named <code>not</code> and an element child named
<code>or</code>.</p>

</div3>

</div2>

<div2>
<head>Templates</head>

<div3>
<head>Overview</head>

<p>When the rule that is to be applied to the source element has been
identified, the rule's template is instantiated. A 
template can contain literal result elements, character data and
instructions for creating fragments of the result tree.  Instructions
are represented by elements in the XSL namespace.</p>

<p>The <code>xsl:apply-templates</code> instruction can select
descendant nodes for processing.  Without any attribute, the
<code>xsl:apply-templates</code> instruction processes the immediate
children nodes of the source element; a <code>select</code> attribute
can be used to process nodes selected by a specified pattern.</p>

<eg><![CDATA[<xsl:template match="chapter/title">
  <fo:rule-graphic/>
  <fo:block space-before="2pt">
    <xsl:text>Chapter </xsl:text>
    <xsl:number/>
    <xsl:text>: </xsl:text>
    <xsl:apply-templates/>
  </fo:block>
  <fo:rule-graphic/>
</xsl:template>]]></eg>

<issue id="issue-instruction-error"><p>Should there be an instruction
that generates an error, like the <code>error</code> procedure in
DSSSL?</p></issue>

<issue id="issue-multiple-results"><p>Should it be possible to create
multiple result trees?</p></issue>

</div3>

<div3>
<head>Creating Elements and Attributes</head>

<div4>
<head>Literal Result Elements</head>

<p>In a template an element in the stylesheet that does not belong to
the XSL namespace is instantiated to create an element node of the
same type.  The created element node will have the attribute nodes
that were present on the element node in the stylesheet tree.  The
created element node will also have the namespace nodes that were
present on the element node in the stylesheet tree with the exception
of any namespace node whose value is the XSL namespace URI
(<code>http://www.w3.org/TR/WD-xsl</code>).</p>

<p>The value of an attribute of a literal result element is
interpreted as an <termref def="dt-attribute-value-template">attribute
value template</termref>: it can contain string expressions contained
in curly braces (<code>{}</code>).</p>

<p>Namespace URIs that occur literally in the stylesheet and that are
being used to create nodes in the result tree can be quoted.  This
applies to:</p>

<ulist>

<item><p>the namespace URI in the expanded name of an literal
result element in the stylesheet</p></item>

<item><p>the namespace URI in the expanded name of an attribute
specified on a literal result element in the stylesheet</p></item>

<item><p>the value of a namespace node on a literal result element in
the stylesheet</p></item>

</ulist>

<p>A namespace URI is quoted by prefixing it with the string
<code>quote:</code>.  This prefix will be removed when the template is
instantiated to create the result element node with its associated
attribute nodes and namespace nodes.</p>

<p>When literal result elements are being used to create element,
attribute, or namespace nodes that use the XSL namespace URI, the
namespace must be quoted to avoid misinterpretation by the XSL
processor.</p>

<note><p>It may be necessary also to quote other namespaces.  For
example, literal result elements belonging to a namespace dealing with
digital signatures might cause XSL stylesheets to be mishandled by
general purpose security software; quoting the namespace would avoid
the possibility of such mishandling.</p></note>

<p>For example, the stylesheet</p>

<eg><![CDATA[<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/TR/WD-xsl"
  xmlns:fo="http://www.w3.org/TR/WD-xsl/FO"
  xmlns:qxsl="quote:http://www.w3.org/TR/WD-xsl">

<xsl:template match="/">
  <qxsl:stylesheet>
    <xsl:apply-templates/>
  </qxsl:stylesheet>
</xsl:template>

<xsl:template match="block">
  <qxsl:template match="{.}">
     <fo:block><qxsl:apply-templates/></fo:block>
  </qxsl:template>
</xsl:template>

</xsl:stylesheet>]]></eg>

<p>will generate an XSL stylesheet from a document of the form:</p>

<eg><![CDATA[<elements>
<block>p</block>
<block>h1</block>
<block>h2</block>
<block>h3</block>
<block>h4</block>
</elements>]]></eg>

</div4>

<div4>
<head>Creating Elements with <code>xsl:element</code></head>

<p>The <code>xsl:element</code> allows an element to be created with a
computed name.  The <code>xsl:element</code> element has a required
<code>name</code> attribute that specifies the name of the element.
The <code>name</code> attribute is interpreted as an <termref
def="dt-attribute-value-template">attribute value template</termref>.
It is instantiated to create an element with the specified name.  The
content of the <code>xsl:element</code> element is a template for the
attributes and children of the created element.</p>

<p>The value of the <code>name</code> attribute after instantiation
must have one of two forms:</p>

<ulist>

<item><p>It can be a <xnt href="&XMLNames;#NT-QName">QName</xnt>.  In
this case the name is expanded in the same way as an element type name
using the namespace declarations in scope for the
<code>xsl:element</code> element in the stylesheet.</p></item>

<item><p>It can be a namespace URI followed by a <code>#</code>
character followed by an <xnt
href="&XMLNames;#NT-NCName">NCName</xnt>.  This can be used
conjunction with a <nt def="NT-NameExpr">NameExpr</nt> to compute a
qualified name.</p></item>

</ulist>

</div4>

<div4>
<head>Creating Attributes with <code>xsl:attribute</code></head>

<p>The <code>xsl:attribute</code> element can be used to add
attributes to result elements whether created by literal result
elements in the stylesheet or by <code>xsl:element</code> elements.
The <code>xsl:attribute</code> element has a required
<code>name</code> attribute that specifies the name of the attribute.
The <code>name</code> attribute is interpreted as an <termref
def="dt-attribute-value-template">attribute value template</termref>
It adds an attribute node to the containing result element node. The
content of the <code>xsl:attribute</code> element is a template for
the value of the created attribute.</p>

<p>The following are all errors:</p>

<ulist>

<item><p>Adding an attribute to an element after children have been
added to it; implementations may either signal the error or ignore the
attribute.</p></item>

<item><p>Including nodes other than text nodes in the value of an
attribute; implementations may either signal the error or ignore the
added nodes.</p></item>

<item><p>Adding an attribute that has the same name as an attribute
already added; implementations may either signal the error or ignore
the duplicate attribute.</p></item>

<item><p>Adding an attribute to a node that is not an element;
implementations may either signal the error or ignore the
attribute.</p></item>

</ulist>

</div4>

<div4>

<head>Named Attribute Sets</head>

<p>The <code>xsl:attribute-set</code> element defines a named set of
attributes.  The <code>name</code> attribute specifies the name of the
attribute set.  The <code>xsl:use</code> element adds a named set of
attributes to an element.  It has a required
<code>attribute-set</code> attribute that specifies the name of the
attribute set.  <code>xsl:use</code> is allowed in the same places as
<code>xsl:attribute</code>.  The content of the
<code>xsl:attribute-set</code> consists of <code>xsl:attribute</code>
elements that specify attributes; it may also contain
<code>xsl:use</code> elements.  The value of attributes in an attribute
set is determined when the attribute set is used rather than when the
attribute set is defined.</p>

<p>The following example creates a named attribute set
<code>title-style</code> and uses it in a template rule.</p>

<eg><![CDATA[<xsl:attribute-set name="title-style">
  <xsl:attribute name="font-size">12pt</xsl:attribute>
  <xsl:attribute name="font-weight">bold</xsl:attribute>
</xsl:attribute-set>

<xsl:template match="chapter/heading">
  <fo:block quadding="start">
    <xsl:use attribute-set="title-style"/>
    <xsl:apply-templates/>
  </fo:block>
</xsl:template>]]></eg>

<p>Any attribute in a named attribute set specified by
<code>xsl:use</code> is not added to an element if the element already
has an attribute of that name.</p>

<p>Multiple definitions of an attribute set with the same name are
merged.  An attribute from a definition that is more <termref
def="dt-important">important</termref> takes precedence over an
attribute from a definition that is less <termref
def="dt-important">important</termref>.  It is an error if there are
two attribute sets with the same name that are equally important and
that both contain the same attribute unless there is a more <termref
def="dt-important">important</termref> definition of the attribute set
that also contains the attribute.  An XSL processor may signal the
error; if it does not signal the error, it must recover by choosing
from amongst the most important definitions that specify the attribute
the one that was specified last in the stylesheet.</p>

<issue id="issue-attribute-set"><p>Merging is the only functionality
offered by attribute sets that is not provided by macros.  Is this a
sufficient reason to keep attribute sets?</p></issue>

</div4>

</div3>

<div3>

<head>Creating Text</head>

<p>A template can also contain text nodes.  Each text node in a
template remaining after whitespace has been stripped as specified in
<specref ref="strip"/> will create a text node with the same value in
the result tree.  Adjacent text nodes in the result tree are
automatically merged.</p>

<p>Note that text is processed at the tree level. Thus, markup of
<code>&amp;lt;</code> in a template will be represented in the
stylesheet tree by a text node that includes the character
<code>&lt;</code>. This will create a text node in the result tree
that contains a <code>&lt;</code> character, which will be represented
by the markup <code>&amp;lt;</code> (or an equivalent character
reference) when the result tree is externalized as an XML
document.</p>

<p>Literal data characters may also be wrapped in an
<code>xsl:text</code> element.  This wrapping may change what
whitespace characters are stripped (see <specref ref="strip"/>) but
does not affect how the characters are handled by the XSL processor
thereafter.</p>

</div3>


<div3>
<head>Creating Processing Instructions</head>

<p>The <code>xsl:pi</code> element is instantiated to create a
processing instruction node.  The content of the <code>xsl:pi</code>
element is a template for the value of the processing instruction
node.  The <code>xsl:pi</code> element has a required
<code>name</code> attribute that specifies the name of the processing
instruction node.  The value of the name attribute is interpreted as
an <termref def="dt-attribute-value-template">attribute value
template</termref>.</p>

<p>For example, this</p>

<eg><![CDATA[<xsl:pi name="xml-stylesheet">href="book.css" type="text/css"</xsl:pi>]]></eg>

<p>would create the processing instruction</p>

<eg><![CDATA[<?xml-stylesheet href="book.css" type="text/css"?>]]></eg>

<p>It is an error if instantiating the content of <code>xsl:pi</code>
creates anything other than characters.  An XSL processor may signal
the error; if it does not signal the error, it must recover by
ignoring the offending nodes together with their content.</p>

<p>It is an error if the result of instantiating the content of the
<code>xsl:pi</code> contains the string <code>?></code>.  An XSL
processor may signal the error; if it does not signal the error, it
must recover by inserting a space after any occurrence of
<code>?</code> that is followed by an <code>></code>.</p>

</div3>

<div3>
<head>Creating Comments</head>

<p>The <code>xsl:comment</code> element is instantiated to create a
comment node in the result tree.  The content of the
<code>xsl:comment</code> element is a template for the value of
the comment node.</p>

<p>For example, this</p>

<eg><![CDATA[<xsl:comment>This file is automatically generated. Do not edit!</xsl:comment>]]></eg>

<p>would create the comment</p>

<eg><![CDATA[<!--This file is automatically generated. Do not edit!-->]]></eg>

<p>It is an error if instantiating the content of
<code>xsl:comment</code> creates anything other than characters.  An
XSL processor may signal the error; if it does not signal the error,
it must recover by ignoring the offending nodes together with their
content.</p>

<p>It is an error if if the result of instantiating the content of the
<code>xsl:comment</code> contains the string <code>--</code> or ends
with <code>-</code>.  An XSL processor may signal the error; if it
does not signal the error, it must recover by inserting a space after
any occurrence of <code>-</code> that is followed by another
<code>-</code>.</p>

</div3>

<div3>
<head id="children">Processing with Template Rules</head>

<p>This example creates a block for a <code>chapter</code>
element and then processes its immediate children.</p>

<eg><![CDATA[<xsl:template match="chapter">
  <fo:block>
    <xsl:apply-templates/>
  </fo:block>
</xsl:template>]]></eg>

<p>In the absence of a <code>select</code> attribute, the
<code>xsl:apply-templates</code> instruction processes all of the
children of the current node, including text nodes.  However, text
nodes that have been stripped as specified in <specref ref="strip"/>
will not be processed.</p>

<ednote><edtext>There is no WG consensus on the use
xsl:apply-templates without a select attribute to process all children
of a node.</edtext></ednote>

<p>A <code>select</code> attribute can be used to process nodes
selected by a pattern instead of all children.  The value of the
<code>select</code> attribute is a <termref
def="dt-select-pattern">select pattern</termref>.  The following example processes all of
the <code>author</code> children of the <code>author-group</code>:</p>

<eg><![CDATA[<xsl:template match="author-group">
  <fo:inline-sequence>
    <xsl:apply-templates select="author"/>
  </fo:inline-sequence>
</xsl:template>]]></eg>

<p>The pattern controls the depth at which matches occur. The
following example processes all of the <code>first-name</code>s of the
<code>author</code>s that are direct children of
<code>author-group</code>:</p>

<eg><![CDATA[<xsl:template match="author-group">
  <fo:inline-sequence>
    <xsl:apply-templates select="author/first-name"/>
  </fo:inline-sequence>
</xsl:template>]]></eg>

<p><code>//</code> can be used in the pattern to allow the matches to
occur at arbitrary depths.</p>

<p>This example processes all of the <code>heading</code> elements
contained in the <code>book</code> element.</p>

<eg><![CDATA[<xsl:template match="book">
  <fo:block>
    <xsl:apply-templates select=".//heading"/>
  </fo:block>
</xsl:template>]]></eg>

<p>An <nt def="NT-AncestorExpr">AncestorExpr</nt> in the pattern
allows the processing of elements that are not descendants of the
current node.  This example finds an employee's department and then
processes the <code>group</code> children of the
<code>department</code>.</p>

<eg><![CDATA[<xsl:template match="employee">
  <fo:block>
    Employee <xsl:apply-templates select="name"/> belongs to group
    <xsl:apply-templates select="ancestor(department)/group"/>
  </fo:block>
</xsl:template>]]></eg>

<p>This example assumes that a <code>department</code> element
contains <code>group</code> and <code>employee</code> elements (at
some level). When processing the <code>employee</code> elements, the
<nt def="NT-AncestorExpr">AncestorExpr</nt> in the pattern allows
navigation upward to the <code>department</code> element in order to
extract the information about the group to which the employee
belongs.</p>

<p>An <nt def="NT-IdExpr">IdExpr</nt> allows processing of
elements with a specific ID.  For example, this template rule applies
to elements with the ID <code>cfo</code>; the second
<code>xsl:apply-templates</code> element processes the
<code>name</code> child of the element with ID <code>ceo</code>:</p>

<eg><![CDATA[<xsl:template match="id(cfo)">
  <xsl:apply-templates select="name"/> reports to <xsl:apply-templates select="id(ceo)/name"/>
</xsl:template>]]></eg>

<p>Multiple <code>xsl:apply-templates</code> elements can be used within a
single template to do simple reordering.  The following example
creates two HTML tables. The first table is filled with domestic sales
while the second table is filled with foreign sales.</p>

<eg><![CDATA[<xsl:template match="product">
  <TABLE>
    <xsl:apply-templates select="sales/domestic"/>
  </TABLE>
  <TABLE>
    <xsl:apply-templates select="sales/foreign"/>
  </TABLE>
</xsl:template>]]></eg>

<note>

<p>It is possible for there to be two matching descendants where one
is a descendant of the other.  This case is not treated specially:
both descendants will be processed as usual. For example, given a
source document</p>

<eg><![CDATA[<doc><div><div></div></div></doc>]]></eg>

<p>the rule</p>

<eg><![CDATA[<xsl:template match="doc">
  <xsl:apply-templates select=".//div"/>
</xsl:template>]]></eg>

<p>will process both the outer <code>div</code> and inner <code>div</code>
elements.</p>

</note>

<p>Use of select patterns in <code>xsl:apply-templates</code> can lead
to infinite loops.  It is an error if, during the invocation of a rule
for an element, that same rule is invoked again for that element.  An
XSL processor may signal the error; if it does not signal the error,
it must recover by creating an empty result tree structure for the
nested invocation.</p>

<issue id="issue-select-function"><p>What mechanisms should be
provided for selecting elements for processing?  For example, how can
elements specified indirectly be handled?  Suppose there's an
<code>xref</code> element with a <code>ref</code> attribute that
specifies the ID of a <code>div</code> element.  The template
for <code>xref</code> needs to select <code>title</code> child of the
<code>div</code> element referenced by the <code>ref</code> attribute.
Should it be possible to select elements in other XML
documents?</p></issue>

</div3>

<div3>

<head>Direct Processing</head>

<p>When the result has a known regular structure, it is useful to be
able to specify directly the template for selected nodes.  The
<code>xsl:for-each</code> element contains a template which is
instantiated for each node selected by the pattern specified by the
<code>select</code> attribute.  The template is instantiated with the
selected node as the current node.</p>

<p>For example, given an XML document with this structure</p>

<eg><![CDATA[<customers>
  <customer>
    <name>...</name>
    <order>...</order>
    <order>...</order>
  </customer>
  <customer>
    <name>...</name>
    <order>...</order>
    <order>...</order>
  </customer>
</customers>]]></eg>

<p>the following would create an HTML document containing a table with
a row for each <code>customer</code> element</p>

<eg><![CDATA[<xsl:template match="/">
  <HTML>
    <HEAD>
      <TITLE>Customers</TITLE>
    </HEAD>
    <BODY>
      <TABLE>
	<TBODY>
	  <xsl:for-each select="customers/customer">
	    <TR>
	      <TH>
		<xsl:apply-templates select="name"/>
	      </TH>
	      <xsl:for-each select="order">
		<TD>
		  <xsl:apply-templates/>
		</TD>
	      </xsl:for-each>
	    </TR>
	  </xsl:for-each>
	</TBODY>
      </TABLE>
    </BODY>
  </HTML>
</xsl:template>]]></eg>

<p>As with <code>xsl:apply-templates</code> the pattern is a <termref
def="dt-select-pattern">select pattern</termref>.  The
<code>select</code> attribute is required.</p>

</div3>

<div3>
<head>Processing Modes</head>

<p>Processing modes allow an element to be processed multiple times, each
time producing a different result.</p>

<p>Both <code>xsl:template</code> and <code>xsl:apply-templates</code>
have an optional <code>mode</code> attribute whose value is a name.
If an <code>xsl:apply-templates</code> element has a <code>mode</code>
attribute, then it applies only those template rules from
<code>xsl:template</code> elements that have a <code>mode</code>
attribute with the same value; if an <code>xsl:apply-templates</code>
element does not have a <code>mode</code> attribute, then it applies
only those template rules from <code>xsl:template</code> elements that
do not have a a <code>mode</code> attribute.</p>

<p>If there is no matching template, then the built-in template rules
are applied, even if a <code>mode</code> attribute was specified in
<code>xsl:apply-templates</code>.</p>

<ednote><edtext>Add some examples.</edtext></ednote>

</div3>

<div3>
<head>Sorting</head>

<p>Sorting is specified by adding <code>xsl:sort</code> elements as
children of <code>xsl:apply-templates</code> or
<code>xsl:for-each</code>.  The first <code>xsl:sort</code> child
specifies the primary sort key, the second <code>xsl:sort</code> child
specifies the secondary sort key and so on.  When
<code>xsl:apply-templates</code> or <code>xsl:for-each</code> has one
or more <code>xsl:sort</code> children, then instead of processing the
selected elements in document order, it sorts the elements according
to the specified sort keys and then processes them in sorted order.
When used in <code>xsl:for-each</code>, <code>xsl:sort</code> elements
must occur first.</p>

<p><code>xsl:sort</code> has a <code>select</code> attribute whose
value is a <termref def="dt-select-pattern">select pattern</termref>.
For each node to be processed, the select pattern is evaluated with
that node as the current node. The value of the first selected node is
used as the sort key for that node.  The default value of the code
<code>select</code> attribute is <code>.</code> (which addresses the
current node).</p>

<p>This string serves as a sort key for the node.  The following
optional attributes on <code>xsl:sort</code> control how the list of
sort keys are sorted:</p>

<ulist>

<item><p><code>order</code> specifies whether the strings should be
sorted in ascending or descending order; <code>ascending</code>
specifies ascending order; <code>descending</code> specifies
descending order; the default is <code>ascending</code></p></item>

<item><p><code>lang</code> specifies the language of the sort keys; it
has the same range of values as <code>xml:lang</code><bibref
ref="XML"/>; if no <code>lang</code> value is specified, the
language should be determined from the system environment</p></item>

<item><p><code>data-type</code> specifies the data type of the
strings; the following values are allowed</p>

<ulist>

<item><p><code>text</code> specifies that the sort keys should be
sorted lexicographically in the culturally correct manner for the
language specified by <code>lang</code></p></item>

<item><p><code>number</code> specifies that the sort keys should be
converted to numbers and then sorted according to the numeric
value; the value specified by <code>lang</code> can be used
to assist in the conversion to numbers</p></item>

</ulist>

<p>The default value is <code>text</code>.</p>

<ednote><edtext>We plan to leverage the work on XML schemas to define
further values in the future.</edtext></ednote>

</item>

<item><p><code>case-order</code> has the value
<code>upper-first</code> or <code>lower-first</code>; this applies
when <code>data-type="text"</code>, and specifies that upper-case
characters should sort before lower-case letters or vice-versa
respectively. For example, if <code>lang="en"</code> then <code>A a B
b</code> are sorted with <code>case-order="upper-first"</code> and
<code>a A b B</code> are sorted with
<code>case-order="lower-first"</code>. The default value is language
dependent.</p></item>

</ulist>

<ednote><edtext>We plan also to add an attribute whose value is a
label identifying the sorting scheme, to be specified by the I18N
WG.</edtext></ednote>

<p>The values of all of the above attributes are interpreted as
<termref def="dt-attribute-value-template">attribute value
templates</termref>.</p>

<note><p>It is recommended that implementors consult <bibref
ref="UNICODE-TR10"/> for information on internationalized
sorting.</p></note>

<p>The sort must be stable: in the sorted list of nodes, any sublist
that has sort keys that all compare equal must be in document
order.</p>

<p>For example, suppose an employee database has the form</p>

<eg><![CDATA[<employees>
  <employee>
    <name>
      <first>James</first>
      <last>Clark</last>
    </name>
    ...
  </employee>
</employees>
]]></eg>
  
<p>Then a list of employees sorted by name could be generated
using:</p>

<eg><![CDATA[<xsl:template match="employees">
 <ul>
  <xsl:apply-templates select="employee">
    <xsl:sort select="name/last"/>
    <xsl:sort select="name/first"/>
  </xsl:apply-templates>
  </ul>
</xsl:template>

<xsl:template match="employee">
 <li>
  <xsl:value-of select="name/first"/>
  <xsl:text> </xsl:text>
  <xsl:value-of select="name/last"/>
 </li>
</xsl:template>]]></eg>

</div3>

<div3>
<head>Numbering</head>

<div4>
<head>Numbering in the Source Tree</head>

<p>The <code>xsl:number</code> element does numbering based on the
position of the current node in the source tree.</p>

<p>The <code>xsl:number</code> element can have the following
attributes:</p>

<ulist>

<item><p>The <code>level</code> attribute specifies what levels of the
source tree should be considered; it has the values
<code>single</code>, <code>multi</code> or <code>any</code>. The
default is <code>single</code>.</p></item>

<item><p>The <code>count</code> attribute is a <termref
def="dt-match-pattern">match pattern</termref> that specifies what
elements should be counted at those levels.  The <code>count</code>
attribute defaults to the element type name of the current
node.</p></item>

<item><p>The <code>from</code> attribute is a <termref
def="dt-match-pattern">match pattern</termref> that specifies where
counting starts from.</p></item>

</ulist>

<p>In addition the <code>xsl:number</code> element has the attributes
specified in <specref ref="convert"/> for number to string
conversion.</p>

<p>The <code>xsl:number</code> element first constructs a list of
positive integers using the <code>level</code>, <code>count</code> and
<code>from</code> attributes:</p>

<ulist>

<item><p>When <code>level="single"</code>, it goes up to the nearest
ancestor (including the current node as its own ancestor) that
matches the <code>count</code> pattern, and constructs a list of length one
containing one plus the number of preceding siblings of that ancestor
that match the <code>count</code> pattern.  If there is no such
ancestor, it constructs an empty list.  If the <code>from</code>
attribute is specified, then the only ancestors that are searched are
those that are descendants of the nearest ancestor that matches the
<code>from</code> pattern.</p></item>

<item><p>When <code>level="multi"</code>, it constructs a list of all
ancestors of the current node in document order followed by the
element itself; it then selects from the list those elements that
match the <code>count</code> pattern; it then maps each element of the
list to one plus the number of preceding siblings of that element that
match the <code>count</code> pattern.  If the <code>from</code>
attribute is specified, then the only ancestors that are searched are
those that are descendants of the nearest ancestor that matches the
<code>from</code> pattern.</p></item>

<item><p>When <code>level="any"</code>, it constructs a list of length
one containing one plus the number of elements at any level of the
document that start before this node and that match the
<code>count</code> pattern.  If the <code>from</code> attribute is
specified, then only elements after the first element before this
element that match the <code>from</code> pattern are
considered.</p></item>

</ulist>

<p>The list of numbers is then converted into a string using the
attributes specified in <specref ref="convert"/>; when used with
<code>xsl:number</code> the value of each of these attributes is
interpreted as an <termref def="dt-attribute-value-template">attribute
value template</termref>.  After conversion, the resulting string is
inserted in the result tree.</p>

<ednote><edtext>Allowing them to be attribute value templates isn't
consistent with the current DTD: the declared values would all have to
be CDATA, and we couldn't use xml:lang because the XML spec doesn't
allow the value to be expressed as a template.</edtext></ednote>

<p>The following would number the items in an ordered list:</p>

<eg><![CDATA[<xsl:template match="ol/item">
  <fo:block>
    <xsl:number/><xsl:text>. </xsl:text><xsl:apply-templates/>
  </fo:block>
<xsl:template>]]></eg>

<p>The following two rules would number <code>title</code> elements.
This is intended for a document that contains a sequence of chapters
followed by a sequence of appendices, where both chapters and
appendices contain sections which in turn contain subsections.
Chapters are numbered 1, 2, 3; appendices are numbered A, B, C;
sections in chapters are numbered 1.1, 1.2, 1.3; sections in
appendices are numbered A.1, A.2, A.3.</p>

<eg><![CDATA[<xsl:template match="title">
  <fo:block>
     <xsl:number level="multi"
                 count="chapter|section|subsection"
                 format="1.1. "/>
     <xsl:apply-templates/>
  </fo:block>
</xsl:template>

<xsl:template match="appendix//title" priority="1">
  <fo:block>
     <xsl:number level="multi"
                 count="appendix|section|subsection"
                 format="A.1. "/>
     <xsl:apply-templates/>
  </fo:block>
</xsl:template>]]></eg>

<p>The following example numbers notes sequentially within a
chapter:</p>

<eg><![CDATA[<xsl:template match="note">
  <fo:block>
     <xsl:number level="any" from="chapter" format="(1) "/>
     <xsl:apply-templates/>
  </fo:block>
</xsl:template>]]></eg>

<p>The following example would number <code>H4</code> elements in HTML
with a three-part label:</p>

<eg><![CDATA[<xsl:template match="H4">
 <fo:block>
   <xsl:number level="any" from="H1" count="H2"/>
   <xsl:text>.</xsl:text>
   <xsl:number level="any" from="H2" count="H3"/>
   <xsl:text>.</xsl:text>
   <xsl:number level="any" from="H3" count="H4"/>
   <xsl:text> </xsl:text>
   <xsl:apply-templates/>
 </fo:block>
</xsl:template>]]></eg>

</div4>

<div4>
<head>Numbering in the Result Tree</head>

<p>The root node of the result and each result element has a set of
named counters (a mapping from names to integers).</p>

<p>Counter values are inserted using <code>xsl:counter</code> and
<code>xsl:counters</code> elements.  The name of the counter is
specified with the <code>name</code> attribute.
<code>xsl:counter</code> first constructs a list of length one
containing the value of the named counter from the nearest ancestor in
the result tree that has a counter with the specified name;
<code>xsl:counters</code> first constructs a list containing, for each
ancestor in the result tree that has a counter with the specified
name, the value of named counter from that ancestor.
<code>xsl:counter</code> and <code>xsl:counters</code> then convert
the list of numbers into a string using the attributes specified in
<specref ref="convert"/>; when used with <code>xsl:counter</code> and
<code>xsl:counters</code> the value of each of these attributes is
interpreted as an <termref def="dt-attribute-value-template">attribute
value template</termref>.</p>

<ednote><edtext>The use of attribute value templates here the same
problem noted for their use in the previous section.</edtext></ednote>

<p>Counters are incremented using the
<code>xsl:counter-increment</code> element.  The <code>name</code>
attribute specifies the name of the counter to be incremented.  It
finds the nearest ancestor in the result tree that has a counter with
the specified name and increments that; if there is no such ancestor,
it adds a counter with that name and a value of zero to the document
root and then increments it.  The counter is incremented by 1 by
default, but this can be changed using the <code>amount</code>
attribute; the value can be any integer.</p>

<p>The <code>xsl:counter-reset</code> element sets the value of a
counter in the current named counter set.  The current named counter
set is the set of named counters of the containing element in the
result tree or of the document root if there is no containing element.
If the current named counter set doesn't contain a counter of that
name, a counter is added to it, otherwise the existing value is
changed. The name of the counter to be set is specified by the
<code>name</code> attribute.  The value to set it to is specified by
the <code>value</code> attribute; the value can be any integer; it
defaults to 0.</p>

<p>The <code>xsl:counter-scope</code> element is a phantom result
element: it behaves just like a normal result element for the purposes
of result numbering in that it is considered part of the result tree
and has a set of named counters, but doesn't actually create a result
element.  This is for when the result tree doesn't have enough
structure for counting.</p>

<note><p>The numbering may be performed in the tree construction
process or may be left for the formatting process.</p></note>

<note><p>These facilities for result tree numbering are based on the
facilities for automatic numbering in <bibref ref="CSS2"/>.</p></note>

<p>The following example would number notes sequentially throughout a
document:</p>

<eg><![CDATA[<xsl:template match="note">
  <xsl:text> (Note </xsl:text>
  <xsl:counter-increment name="note"/>
  <xsl:counter name="note"/>
  <xsl:text>).</xsl:text>
</xsl:template>]]></eg>

<p>The following would turn ordered lists into definition lists:</p>

<eg><![CDATA[<xsl:template match="OL">
  <dl>
    <xsl:counter-reset name="li"/>
    <xsl:apply-templates/>
  </dl>
</xsl:template>

<xsl:template match="LI">
  <xsl:counter-increment name="li"/>
  <dt><xsl:counter name="li"/></dt>
  <dd><xsl:apply-templates/></dd>
</xsl:template>]]></eg>

<p>The following would do HTML style numbering:</p>

<eg><![CDATA[<xsl:template match="h2">
  <xsl:counter-increment name="h2"/>
  <p>
    <xsl:counter name="h2"/>
    <xsl:text>. </xsl:text>
    <xsl:apply-templates/>
  </p>
  <xsl:counter-reset name="h3"/>
</xsl:template>

<xsl:template match="h3">
  <xsl:counter-increment name="h3"/>
  <p>
    <xsl:counter name="h2"/>
    <xsl:text>.</xsl:text>
    <xsl:counter name="h3"/>
    <xsl:text>. </xsl:text>
    <xsl:apply-templates/>
  </p>
  <xsl:counter-reset name="h4"/>
</xsl:template>

<xsl:template match="h4">
  <xsl:counter-increment name="h4"/>
  <p>
    <xsl:counter name="h2"/>
    <xsl:text>.</xsl:text>
    <xsl:counter name="h3"/>
    <xsl:text>.</xsl:text>
    <xsl:counter name="h4"/>
    <xsl:text>.</xsl:text>
    <xsl:apply-templates/>
  </p>
</xsl:template>]]></eg>

<p>The following would deal with recursive <code>div</code>s each with
a <code>title</code> child:</p>

<eg><![CDATA[<xsl:template match="div">
  <div>
    <xsl:apply-templates/>
  </div>
</xsl:template>

<xsl:template match="title">
 <p>
  <xsl:counter-increment name="div"/>
  <xsl:counters name="div" format="1.1. "/>
  <xsl:apply-templates/>
 </p>
 <xsl:counter-reset name="div"/>
</xsl:template>]]></eg>

</div4>

<div4 id="convert">
<head>Number to String Conversion Attributes</head>

<p>The following attributes are used to control conversion of a list
of numbers into a string. The numbers are integers greater than
0. The attributes are all optional.</p>

<p>The main attribute is <code>format</code>.  The default value for
the <code>format</code> attribute is <code>1</code>.  The
<code>format</code> attribute is split into a sequence of tokens where
each token is a maximal sequence of alphanumeric characters or a
maximal sequence of non-alphanumeric characters.  Alphanumeric means
any character that has a Unicode category of Nd, Nl, No, Lu, Ll, Lt,
Lm or Lo.  The alphanumeric tokens (format tokens) specify the format
to be used for each number in the list.  If the first token is a
non-alphanumeric token, then the constructed string will start with
that token; if the last token is non-alphanumeric token, then the
constructed string will end with that token.  Non-alphanumeric tokens
that occur between two format tokens are separator tokens that are
used to join numbers in the list.  The n-th format token will be used
to format the n-th number in the list.  If there are more numbers than
format tokens, then the last format token will be used to format
remaining numbers.  If there are no format tokens, then a format token
of <code>1</code> is used to format all numbers.  The format token
specifies the string to be used to represent the number 1.  Each
number after the first will be separated from the preceding number by
the separator token preceding the format token used to format that
number, or, if there are no separator tokens, then by
<code>.</code>.</p>

<p>Format tokens are a superset of the allowed values for the
<code>type</code> attribute for the <code>OL</code> element in HTML
4.0 and are interpreted as follows:</p>

<ulist>

<item><p>Any token where the last character has a decimal digit value
of 1 (as specified in the Unicode 2.0 character property database),
and the Unicode value of preceding characters is one less than the
Unicode value of the last character.  This generates a decimal
representation of the number where each number is at least as long as
the format token.  Thus a format token <code>1</code> generates the
sequence <code>1 2 ... 10 11 12 ...</code>, and a format token
<code>01</code> generates the sequence <code>01 02 ... 09 10 11 12
... 99 100 101</code>.</p></item>

<item><p>A format token <code>A</code> generates the sequence <code>A
B C ... Z AA AB AC...</code>.</p></item>

<item><p>A format token <code>a</code> generates the sequence <code>a
b c ... z aa ab ac...</code>.</p></item>

<item><p>A format token <code>i</code> generates the sequence <code>i
ii iii iv v vi vii vii ix x ...</code>.</p></item>

<item><p>A format token <code>I</code> generates the sequence <code>I
II III IV V VI VII VII IX X ...</code>.</p></item>

<item><p>Any other format token indicates a numbering sequence that
starts with that token.  If an implementation does not support a
numbering system that starts with that token, it must use a format
token of <code>1</code>.</p></item>

</ulist>

<p>When numbering with an alphabetic sequence, the
<code>xml:lang</code> attribute specifies which language's alphabet is
to be used.</p>

<note><p>This can be considered as specifying the language of the
value of the <code>format</code> attribute and hence is consistent
with the semantics of <code>xml:lang</code>.</p></note>

<p>The <code>letter-value</code> attribute disambiguates between
numbering schemes that use letters.  In many languages there are two
commonly used numbering schemes that use letters.  One numbering
scheme assigns numeric values to letters in alphabetic sequence, and
the other assigns numeric values to each letter in some other manner.
In English, these would correspond to the numbering sequences
specified by the format tokens <code>a</code> and <code>i</code>.  In
some languages the first member of each sequence is the same, and so
the format token alone would be ambiguous.  A value of
<code>alphabetic</code> specifies the alphabetic sequence; a value of
<code>other</code> specifies the other sequence.</p>

<p>The <code>digit-group-sep</code> attribute gives the separator
between groups of digits, and the optional
<code>n-digits-per-group</code> specifies the number of digits per
group.  For example, <code>digit-group-sep=","</code> and
<code>n-digits-per-group="3"</code> would produce numbers of the form
<code>1,000,000</code>.</p>

<p>The <code>sequence-src</code> attribute gives the URI of a text
resource that contains a whitespace separated list of the members of
the numbering sequence.</p>

<ednote><edtext>Specify what should happen when the sequence runs
out.</edtext></ednote>

<p>Here are some examples of conversion specifications:</p>

<ulist>

<item><p><code>format="&amp;#x30A2;"</code> specifies Katakana
numbering</p></item>

<item><p><code>format="&amp;#x30A4;"</code> specifies Katakana
numbering in the <quote>iroha</quote> order</p></item>

<item><p><code>format="&amp;#x0E51;"</code> specifies numbering with
Thai digits</p></item>

<item><p><code>format="&amp;#x05D0;" letter-value="other"</code>
specifies <quote>traditional</quote> Hebrew numbering</p></item>

<item><p><code>format="&amp;#x10D0;" letter-value="other"</code>
specifies Georgian numbering</p></item>

<item><p><code>format="&amp;#x03B1;" letter-value="other"</code>
specifies <quote>classical</quote> Greek numbering</p></item>

<item><p><code>format="&amp;#x0430;" letter-value="other"</code>
specifies Old Slavic numbering</p></item>

</ulist>

</div4>

</div3>

<div3>
<head>Conditionals within a Template</head>

<p>There are two instructions in XSL which support conditional
processing in a template: <code>xsl:if</code> and
<code>xsl:choose</code>. The <code>xsl:if</code> instruction provides
simple if-then conditionality; the <code>xsl:choose</code> instruction
supports selection of one choice when there are several
possibilities.</p>

<div4>
<head>Conditional Processing with <code>xsl:if</code></head>

<p>The <code>xsl:if</code> element has a single attribute,
<code>test</code> which specifies a <termref
def="dt-select-pattern">select pattern</termref>.  The content is a
template.  If the pattern selects a non-empty list of elements,
then the content is instantiated; otherwise nothing is created.  In
the following example, the names in a group of names are formatted as
a comma separated list:</p>

<eg><![CDATA[<xsl:template match="namelist/name">
  <xsl:apply-templates/>
  <xsl:if test=".[not(last-of-type())]">, </xsl:if>
</xsl:template>]]></eg>

<issue id="issue-condition-test"><p>What should be the name and
allowed value of the attribute that specifies the condition on
<code>xsl:if</code> and <code>xsl:when</code>? Should it be
generalized to allow anything that is allowed within <code>[]</code>?
Should it be a match pattern rather than a select pattern?</p></issue>

</div4>


<div4>
<head>Conditional Processing with <code>xsl:choose</code></head>

<p>The <code>xsl:choose</code> element selects one among a number of
possible alternatives. It consists of a series of
<code>xsl:when</code> elements followed by an optional
<code>xsl:otherwise</code> element.  Each <code>xsl:when</code>
element has a single attribute, <code>test</code>, which specifies a
<termref def="dt-select-pattern">select pattern</termref>; the test is
treated as true if the pattern selects a non-empty list of elements.
The content of the <code>xsl:when</code> and
<code>xsl:otherwise</code> elements is a template.  When an
<code>xsl:choose</code> element is processed, each of the
<code>xsl:when</code> elements is tested in turn.  The content of the
first, and only the first, <code>xsl:when</code> element whose test is
true is instantiated.  If no <code>xsl:when</code> is true, the
content of the <code>xsl:otherwise</code> element is instantiated. If
no <code>xsl:when</code> element is true, and no
<code>xsl:otherwise</code> element is present, nothing is created.</p>

<p>The following example enumerates items in an ordered list using
arabic numerals, letters, or roman numerals depending on the depth to
which the ordered lists are nested.</p>

<eg><![CDATA[<xsl:template match="orderedlist/listitem">
  <fo:list-item indent-start='2pi'>
    <fo:list-item-label>
      <xsl:choose>
        <xsl:when test='ancestor(orderedlist/orderedlist)'>
          <xsl:number format="i"/>
        </xsl:when>
        <xsl:when test='ancestor(orderedlist)'>
          <xsl:number format="a"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:number format="1"/>
        </xsl:otherwise>
      </xsl:choose>
      <xsl:text>. </xsl:text>
    </fo:list-item-label>
    <fo:list-item-body>
      <xsl:apply-templates/>
    </fo:list-item-body>
  </fo:list-item>
</xsl:template>]]></eg>

<issue id="issue-if-when-unify"><p>Should <code>xsl:if</code> and
<code>xsl:when</code> be unified into a single element?</p></issue>

</div4>
</div3>

<div3>
<head>Copying</head>

<p>The <code>xsl:copy</code> element provides an easy way of copying
the current node. The <code>xsl:copy</code> element is replaced by a
copy of the current node.  The namespace nodes of the current node are
automatically copied as well, but the attributes and children of the
node are not automatically copied.  The content of the
<code>xsl:copy</code> element is a template for the attributes and
children of the created node; the content is not used for nodes of
types that do not have attribues or children (attributes, text,
comments and processing instructions).</p>

<p>The root node is treated specially because the root node of the
result tree is created implicitly.  When the current node is the root
node, <code>xsl:copy</code> will not create a root node, but will just
use the content template.</p>

<p>For example, the identity transformation can be written using
<code>xsl:copy</code> as follows:</p>

<eg><![CDATA[<xsl:template match="*|@*|comment()|pi()|text()">
  <xsl:copy>
    <xsl:apply-templates select="*|@*|comment()|pi()|text()"/>
  </xsl:copy>
</xsl:template>]]></eg>

</div3>


<div3 id="stringexpr">
<head>Computing Generated Text</head>

<p>Within a template, the <code>xsl:value-of</code> element can
be used to compute generated text, for example by extracting text from
the source tree or by inserting the value of a string constant.  The
<code>xsl:value-of</code> element does this with a string expression
that is specified as the value of the <code>select</code> attribute.
String expressions can also be used inside attribute values of literal
result elements by enclosing the string expression in curly brace
(<code>{}</code>).</p>

<div4>
<head>String Expressions</head>

<scrap>
<head>String Expressions</head>
<prod id="NT-StringExpr">
<lhs>StringExpr</lhs>
<rhs><nt def="NT-SelectExpr">SelectExpr</nt></rhs>
<rhs>| <nt def="NT-NameExpr">NameExpr</nt></rhs>
<rhs>| <nt def="NT-ConstantRef">ConstantRef</nt></rhs>
<rhs>| <nt def="NT-MacroArgRef">MacroArgRef</nt></rhs>
</prod>
</scrap>

<p>The value of a string expression that is a pattern is the value of
the first node selected by the pattern.  The value of each kind of
node is described in <specref ref="data-model"/>.  If no nodes are
selected by the pattern, then the value is the empty string.  The
pattern is a <termref def="dt-select-pattern">select
pattern</termref>.</p>

<issue id="issue-resolve-expr"><p>Do we need a
<code>resolve(pattern)</code> string expression that treats the
characters as a relative URI and turns it into an absolute URI using
the base URI of the addressed node?</p></issue>

<scrap>
<head>Name Expression</head>
<prod id="NT-NameExpr">
<lhs>NameExpr</lhs>
<rhs>'name' '(' <nt def="NT-SelectExpr">SelectExpr</nt> ')'</rhs>
</prod>
</scrap>

<p>The value of a <nt def="NT-NameExpr">NameExpr</nt> is the expanded
name of the first node selected by the <nt
def="NT-SelectExpr">SelectExpr</nt>.  If no nodes are selected or the first
node does not have a name, then the value is the empty string.  If the
expanded name has a null URI, then the value is just the local
name. If the expanded name has a non-null URI, the value is the
URI followed by the character <code>#</code> followed by the local
name.</p>

</div4>

<div4>
<head>Using String Expressions with <code>xsl:value-of</code></head>

<p>The <code>xsl:value-of</code> element is replaced by the value of
the string expression specified by the <code>select</code> attribute.
The <code>select</code> attribute is required.</p>

<p>For example, the following creates an HTML paragraph from a
<code>person</code> element with <code>first-name</code> and
<code>surname</code> attributes.</p>

<eg><![CDATA[<xsl:template match="person">
  <P>
   <xsl:value-of select="@first-name"/>
   <xsl:text> </xsl:text>
   <xsl:value-of select="@surname"/>
  </P>
</xsl:template>]]></eg>

<p>For example, the following creates an HTML paragraph from a
<code>person</code> element with <code>first-name</code> and
<code>surname</code> children elements.</p>

<eg><![CDATA[<xsl:template match="person">
  <P>
   <xsl:value-of select="first-name"/>
   <xsl:text> </xsl:text>
   <xsl:value-of select="surname"/>
  </P>
</xsl:template>]]></eg>

<p>The following precedes each <code>procedure</code> element with a
paragraph containing the security level of the procedure.  It assumes
that the security level that applies to a procedure is determined by a
<code>security</code> attribute on an ancestor element of the
procedure. It also assumes that if more than one ancestor has a
<code>security</code> attribute then the security level is determined
by the closest such ancestor of the procedure.</p>

<eg><![CDATA[<xsl:template match="procedure">
  <fo:block>
    <xsl:value-of select="ancestor(*[@security])/@security"/>
  </fo:block>
  <xsl:apply-templates/>
</xsl:template>]]></eg>

<issue id="issue-inherited-attribute"><p>Unless an element counts as
one of its own ancestors, using
<code>ancestor(*[@security])/@security</code>
won't work to get the inherited value of an attribute.  We could
either say <code>ancestor</code> always includes the current node;
alternatively we could provide a variant of <code>ancestor</code> that
does include the current node; alternatively we could provide a select
pattern of the form
<code>inherited-attribute('security')</code>.</p></issue>

</div4>

<div4 id="attribute-value-templates">
<head>Attribute Value Templates</head>

<p><termdef id="dt-attribute-value-template" term="Attribute Value
Template">In an attribute value that is interpreted as an
<term>attribute value template</term>, such as an attribute of a
literal result element, string expressions can be used by surrounding
the string expression with curly braces (<code>{}</code>)</termdef>.
The attribute value template is instantiated by replacing the string
expression together with surrounding curly braces by the value of the
string expression.</p>

<p>The following example creates an <code>IMG</code> result element
from a <code>photograph</code> element in the source; the value of the
<code>SRC</code> attribute of the <code>IMG</code> element is computed
from the value of the <code>image-dir</code> constant and the content
of the <code>href</code> child of the <code>photograph</code> element;
the value of the <code>WIDTH</code> attribute of the <code>IMG</code>
element is computed from the value of the <code>width</code>
attribute of the <code>size</code> child of the
<code>photograph</code> element:</p>

<eg><![CDATA[<xsl:constant name="image-dir" value="/images"/>

<xsl:template match="photograph">
<IMG SRC="{constant(image-dir)}/{href}" WIDTH="{size/@width}"/>
</xsl:template>]]></eg>

<p>With this source</p>

<eg><![CDATA[<photograph>
  <href>headquarters.jpg</href>
  <size width="300"/>
</photograph>]]></eg>

<p>the result would be</p>

<eg><![CDATA[<IMG SRC="/images/headquarters.jpg" WIDTH="300"/>]]></eg>

<p>When an attribute value template is instantiated, a double left or
right curly brace outside a string expression will be replaced by a
single curly brace.  It is an error if a right curly brace occurs in
an attribute value template outside a string expression without being
followed by a second right curly brace; an XSL processor may signal
the error or recover by treating the right curly brace as if it had
been doubled.  A right curly brace inside an <nt
def="NT-Literal">Literal</nt> in a string expression is
not recognized as terminating the string expression.</p>

<p>Curly braces are <emph>not</emph> recognized recursively inside
string expressions.  For example:</p>

<eg role="error"><![CDATA[<a href="#{id({@ref})/title}">]]></eg>

<p>is <emph>not</emph> allowed.  Instead use simply:</p>

<eg><![CDATA[<a href="#{id(@ref)/title}">]]></eg>

</div4>

</div3>

<div3>
<head>String Constants</head>

<p>Global string constants may be defined using an
<code>xsl:constant</code> element.  The name attribute specifies the
name of the constant, and the <code>value</code> attribute specified
the value.</p>

<issue id="issue-constant-value"><p>Should the value of the constant
be specified in the content of the <code>xsl:constant</code> element
rather than by a <code>value</code> attribute?</p></issue>

<p>A stylesheet must not contain more than one definition of a
constant with the same name and same <termref
def="dt-important">importance</termref>.  A definition of a
constant will not be used if there is another definition of a constant
with the same name and higher <termref
def="dt-important">importance</termref>.</p>

<p>String constants are referenced using a <nt
def="NT-ConstantRef">ConstantRef</nt> string expression.</p>

<scrap>
<head>String Constant References</head>
<prod id="NT-ConstantRef">
<lhs>ConstantRef</lhs>
<rhs>'constant' '(' <xnt href="&XMLNames;#NT-NCName">NCName</xnt> ')'</rhs>
</prod>
</scrap>

<eg><![CDATA[<xsl:constant name="para-font-size" value="12pt"/>

<xsl:template match="para">
 <fo:block font-size="{constant(para-font-size)}">
   <xsl:apply-templates/>
 </fo:block>
</xsl:template>
]]></eg>

<issue id="issue-local-constants"><p>Should there be a way to define
local constants?</p></issue>

<p>The <code>value</code> attribute is interpreted as an <termref
def="dt-attribute-value-template">attribute value template</termref>.
If the value of a constant definition <code>x</code> references a
constant <code>y</code>, then the value for <code>y</code> must be
computed before the value of <code>x</code>.  It is an error if it is
impossible to do this for all constant definitions because of
dependency cycles.</p>

</div3>

<div3>
<head>Macros</head>

<issue id="issue-macro-name"><p>Should macros be called something
else?</p></issue>

<p>Parts of templates can also be factored out of similar rules
into macros for reuse.  Macros allow authors to create aggregate
result fragments and refer to the composite as if it were a single
object.  In this example, a macro is defined for a boxed paragraph
with the word <quote>Warning!</quote> preceding the contents.  The
macro is referenced from a rule for <code>warning</code> elements.</p>

<eg><![CDATA[<xsl:macro name="warning-para">
  <fo:block-level-box>
    <fo:block>
      <xsl:text>Warning! </xsl:text>
      <xsl:contents/>
    </fo:block>
  </fo:block-level-box>
</xsl:macro>

<xsl:template match="warning">
  <xsl:invoke macro="warning-para">
    <xsl:apply-templates/>
  </xsl-invoke>
</xsl:template>]]></eg>

<p>Macros are defined using the <code>macro</code> element. The
<code>name</code> attribute specifies the name of the macro being
defined.  The content of the <code>macro</code> element is a
template, called the body of the macro.  A macro is invoked
using the <code>xsl:invoke</code> element; the content of
<code>xsl:invoke</code> is a template.  The name of the macro
to be invoked is given by the <code>macro</code> attribute.  Invoking a
macro first instantiates the content of <code>xsl:invoke</code>. It
then instantiates the body of the invoked macro passing it the result tree
fragment created by the instantiation of the content of
<code>xsl:invoke</code>; this fragment can be inserted in the body of
the macro using the <code>xsl:contents</code> element.</p>

<p>Macros allow named arguments to be declared with the
<code>xsl:macro-arg</code> element; the <code>name</code> attribute
specifies the argument name, and the optional <code>default</code>
attribute specifies the default value for the argument.  Within the
body of a macro, macro arguments are referenced using a <nt
def="NT-MacroArgRef">MacroArgRef</nt> string expression.  It is an
error to refer to a macro argument that has not been declared.  An XSL
processor may signal the error; if it does not signal the error, it
must recover by using an empty string.  Arguments are supplied to a
macro invocation using the code <code>xsl:arg</code> element; the
<code>name</code> attribute specifies the argument name, and the
<code>value</code> attribute specifies the argument value.  It is an
error to supply an argument to a macro invocation if the macro did not
declare an argument of that name.  An XSL processor may signal the
error; if it does not signal the error, it must recover by ignoring
the argument.  The <code>value</code> attribute of
<code>xsl:arg</code> and the <code>default</code> attribute of
<code>xsl:macro-arg</code> are interpreted as <termref
def="dt-attribute-value-template">attribute value templates</termref>;
they can contain string expressions in curly braces as with literal
result elements.</p>

<scrap>
<head>Macro Argument References</head>
<prod id="NT-MacroArgRef">
<lhs>MacroArgRef</lhs>
<rhs>'arg' '(' <xnt href="&XMLNames;#NT-NCName">NCName</xnt> ')'</rhs>
</prod>
</scrap>

<p>This example defines a macro for a <code>numbered-block</code> with
an argument to control the format of the number.</p>

<eg><![CDATA[<xsl:macro name="numbered-block">
  <xsl:macro-arg name="format" default="1. "/>
  <xsl:number format="{arg(format)}"/>
  <fo:block/>
    <xsl:contents/>
  </fo:block>
</xsl:macro>

<xsl:template match="appendix/title">
  <xsl:invoke macro="numbered-block">
    <xsl:arg name="format" value="A. "/>
    <xsl:apply-templates/>
  </xsl:invoke>
</xsl:template>]]></eg>

<p>It is an error if a stylesheet contains more than one definition of
a macro with the same name and same <termref
def="dt-important">importance</termref>.  An XSL processor may signal
the error; if it does not signal the error, if must recover by
choosing from amongst the definitions with highest importance the one
that occurs last in the stylesheet.</p>

<issue id="issue-macro-arg-syntax"><p>The proposal used the same
element for declaring macro arguments and for invoking them.  Should
these be separate elements and if so what should they be
called?</p></issue>

</div3>
</div2>

<div2>
<head>Combining Stylesheets</head>

<p>XSL provides two mechanisms to combine stylesheets:</p>

<slist>

<sitem>an import mechanism that allows stylesheets to override each
other, and</sitem>

<sitem>an inclusion mechanism that allows stylesheets to be textually
combined.</sitem>

</slist>

<div3 id="import">
<head>Stylesheet Import</head>

<p>An XSL stylesheet may contain <code>xsl:import</code> elements. All
the <code>xsl:import</code> elements must occur at the beginning of
the stylesheet.  The <code>xsl:import</code> element has an
<code>href</code> attribute whose value is the URI of a stylesheet to
be imported.  A relative URI is resolved relative to the base URI of
the <code>xsl:import</code> element (see <specref
ref="base-uri"/>).</p>

<eg><![CDATA[<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
  <xsl:import href="article.xsl"/>
  <xsl:import href="bigfont.xsl"/>
  <xsl:attribute-set name="note-style">
    <xsl:attribute name="font-style">italic</xsl:attribute>
  </xsl:attribute-set>
</xsl:stylesheet>]]></eg>

<p><termdef id="dt-important" term="Important">Rules and definitions in
the importing stylesheet are defined to be more <term>important</term>
than rules and definitions in any imported stylesheets.  Also rules
and definitions in one imported stylesheet are defined to be more
<term>important</term> than rules and definitions in previous imported
stylesheets.</termdef></p>

<p>In general a more important rule or definition takes precedence
over a less important rule or definition.  This is defined in detail
for each kind of rule and definition.</p>

<issue id="issue-stylesheet-partition"><p>Should there be an XSL
defined element that can be used to divide a stylesheet into parts,
each of which is treated as if it were separately imported for
precedence purposes?</p></issue>

<issue id="issue-import-source"><p>Provide a way for a stylesheet
to import a stylesheet that is embedded in the document.</p></issue>

<issue id="issue-import-media"><p>Should we provide media-dependent
imports as in CSS?</p></issue>

<ednote><edtext>Say something about the case where the same stylesheet
gets imported twice. This should be treated the same as importing a
stylesheet with the same content but different URIs.  What about
import loops?</edtext></ednote>

<p><code>xsl:apply-imports</code> processes the current node using
only template rules that were imported into the stylesheet containing
the current rule; the node is processed in the current rule's
mode.</p>

<ednote><edtext>Expand this.</edtext></ednote>

</div3>

<div3>
<head>Stylesheet Inclusion</head>

<p>An XSL stylesheet may include another XSL stylesheet using an
<code>xsl:include</code> element. The <code>xsl:include</code> element
has an <code>href</code> attribute whose value is the URI of a
stylesheet to be included.  A relative URI is resolved relative to the
base URI of the <code>xsl:include</code> element (see <specref
ref="base-uri"/>). The <code>xsl:include</code> element can occur as
the child of the <code>xsl:stylesheet</code> element at any point
after all <code>xsl:import</code> elements.</p>

<p>The inclusion works at the XML tree level.  The resource located by
the <code>href</code> attribute value is parsed as an XML document,
and the children of the <code>xsl:stylesheet</code> element in this
document replace the <code>xsl:include</code> element in the including
document.  Also any <code>xsl:import</code> elements in the included
document are moved up in the including document to after any existing
<code>xsl:import</code> elements in the including document. Unlike
with <code>xsl:import</code>, the fact that rules or definitions are
included does not affect the way they are processed.</p>

<ednote><edtext>What happens when a stylesheet directly or indirectly
includes itself?</edtext></ednote>

</div3>

<div3>
<head>Embedding Stylesheets</head>

<p>Normally an XSL stylesheet is a complete XML document with the
<code>xsl:stylesheet</code> element as the document element. However an XSL
stylesheet may also be embedded in another resource. Two forms of
embedding are possible:</p>

<slist>

<sitem>the XSL stylesheet may be textually embedded in a non-XML
resource, or</sitem>

<sitem>the <code>xsl:stylesheet</code> element may occur in an XML
document other than as the document element.</sitem>

</slist>

<p>In the second case, the possibility arises of documents with inline
style, that is documents that specify their own style. XSL does not
define a specific mechanism for this. This is because this can be done
by means of a general purpose mechanism for associating stylesheets
with documents provided that:</p>

<slist>

<sitem>the mechanism allows a part of a resource to be specified as
the stylesheet, for example by using a URI with a fragment identifier,
and</sitem>

<sitem>the mechanism can itself can be embedded in the document, for
example as a processing instruction.</sitem>

</slist>
<p>It is not in the scope of XSL to define such a mechanism.</p>
<note>
<p>This is because the mechanism should be independent of any one stylesheet
mechanism.</p>
</note>
<p>The xsl:stylesheet element may have an ID attribute that specifies a unique
identifier.</p>

<note><p>In order for such an attribute to be used with the
<code>id</code> XPointer location term, it must actually be declared
in the DTD as being an ID.</p></note>

<p>The following example shows how inline style can be accomplished
using the <code>xml-stylesheet</code> processing instruction mechanism
for associating a stylesheet with an XML document.  The URI uses an
XPointer in a fragment identifier to locate the
<code>xsl:stylesheet</code> element.</p>

<eg><![CDATA[<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="#id(style1)"?>
<!DOCTYPE doc SYSTEM "doc.dtd">
<doc>
<head>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl" id="style1">
<xsl:import href="doc.xsl"/>
<xsl:template match="id(foo)">
 <fo:block font-weight="bold"><xsl:apply-templates/></fo:block>
</xsl:template>
</xsl:stylesheet>
</head>
<body>
<para id="foo">
...
</para>
</body>
</doc>
]]></eg>

<note><p>The <code>type</code> pseudo-attribute in the
<code>xml-stylesheet</code> processing instruction identifies the
stylesheet language, not the content type of the resource of which the
stylesheet is a part.</p></note>

</div3>
</div2>

<div2>
<head>Extensibility</head>

<p>This section will describe an extensibility mechanism for the tree
construction process.</p>

<issue id="issue-construct-extensibility"><p>Should there be some
extensibility mechanism for the tree construction process?  If so, how
should it work?  Should it be language independent?</p></issue>

</div2>

</div1>

<div1><head>Formatting</head>
<div2><head>Introduction</head>
<p>
The approach that we have taken in constructing this draft was to evaluate the requirements for print and online documents and established a target set of capabilities. This set of capabilities reflect the long-term goals of XSL.
</p>
<p>
In this draft we concentrated on documenting a subset of the formatting capability that addressed basic WP-level pagination. We expect to cover more sophisticated pagination and support for layout-driven documents in later drafts.
</p>
<ednote>
<edtext>Because we are in the process of merging definitions to support the joint formatting model, we have not completed transfering all definitions from the previous draft.
</edtext>
</ednote>
</div2><div2><head>Formatting Model</head>
<ednote><edtext>The formatting model portion of this specification
is an exposition of a set of working notes developed by a sub-committee
of XSL WG. The goals of this sub-committee have been (1) to develop
input to the W3C Common Formatting Model and (2) to provide a semantic
model in terms of which XSL can be described. The sub-committee
has been integrating the CSS Box Model and the Area Semantics of
XSL. We are distributing this work in progress, recognizing that
the terminology used below is not fully integrated with the CSS
or XSL terminology and that there are still technical issues in
the XSL semantics needing resolution.</edtext></ednote>
<p>In XSL, one creates a number of formatting-objects that serve
as inputs (or specifications) to a formatter. The formatter, by
applying the formatting model, constructs a hierarchical arrangement
of areas and spaces to produce the formatted result. This section
describes that general model of spaces and areas, as well as how
they interact with one another. The purpose is to present the fundamental
semantics of formatting objects and properties, but not to specify individual
flow objects. It should be seen as describing a series of constraints
for conforming implementations, and not a prescribing any particular
algorithm, e.g. for line breaking, letterspacing, hyphenation, or
kerning.</p>
<div3><head>Introduction</head>
<p>The formatting model is defined in terms of rectangular areas
and spaces. </p>
<ulist><item><p>Areas reserve space and hold content.</p>
<p>Selected rectangular areas may have their own coordinate systems
and may contain other rectangular areas. </p>
<p>Rectangular areas may be filled with other areas; when this happens
the contained areas are placed in accordance with the <code
    role = "attrname">writing-mode</code>, a property of the containing
area which controls the direction of placement of successive contained
areas.</p>
<p><ednote><edtext>Further versions or extensions of the model may
take into account non-rectangular areas.</edtext></ednote></p>
<p>A rectangular area is like a CSS box in that it has <termref
    def = "fm-margin">margin</termref>s, <termref def = "fm-border">border</termref>s,
and <termref def = "fm-padding">padding</termref>, which are specified
by properties of the formatting object that caused the creation
of the area. </p>
<p><ednote><edtext>We have not fully resolved technical differences
between CSS's use of margins and XSL's use of display-space and
inline-space. I have left the references to margins in this section,
because I believe that these issues can be resolved and we will eventually
need to describe handling of margins at those locations in the document.. However,
the descriptions of the handling of inline-space and display-space
is more accurate and more complete at this time.</edtext></ednote></p></item>
<item><p>Spaces reserve space before, after, or  between areas and
do not have content. They are used to make adjustments to the layout. </p></item></ulist>
<p>It is the responsibility of the formatter to manage inheritance
and to specify the resultant properties when creating any area.
This is necessary since this formatting model should be applicable
to both XSL and CSS, which have differing inheritance strategies.
It is therefore necessary for the formatter to derive certain properties
when it creates (synthesizes) an area that has no directly related
formatting object (such as the creation of line-areas within a block
area).</p></div3>
<div3><head>Rectangular areas</head>
<p>There are four kinds of rectangular areas: <termref
    def = "fm-area-container">area-container</termref>s, <termref
    def = "fm-block-area">block-area</termref>s, <termref
    def = "fm-line-area">line-area</termref>s, and <termref
    def = "fm-inline-area">inline-area</termref>s.</p>
<ulist><item><p><termref def = "fm-area-container">Area-container</termref>s
may contain smaller <termref def = "fm-area-container">area-container</termref>s.
Alternatively, an <termref def = "fm-area-container">area-container</termref> may
be filled with a sequence of <termref def = "fm-block-area">block-area</termref>s
and <termref def = "fm-display-space">display-space</termref>s,
which are stacked (placed sequentially and adjacent to one another,
possibly separated by display-spaces) within the <termref
    def = "fm-area-container">area-container</termref> in a direction
determined by the <code role = "attrname">writing-mode</code>. </p>
<p><termref def = "fm-area-container">Area-container</termref>s
always have a <code role = "attrname">writing-mode</code> and set
a coordinate system for all contained areas. The <code role = "attrname">start-indent</code> and <code
    role = "attrname">end-indent</code> of any <termref
    def = "fm-block-area">block-area</termref> is measured from
the area-container's corresponding edges, not from the edges of
any intervening (nested) <termref def = "fm-block-area">block-area</termref>.</p>
<p><termref def = "fm-area-container">Area-container</termref>s
may be placed at a specific positions within the containing area
or may be attached to the inside of any edge of the containing area.</p></item>
<item><p><termref def = "fm-block-area">Block-area</termref>s are
filled with <termref def = "fm-line-area">line-area</termref>s, <termref
    def = "fm-display-space">display-space</termref>s, and nested <termref
    def = "fm-block-area">block-area</termref>s stacked (placed
sequentially and adjacent to one another, possibly separated by
display-spaces) in a direction determined by the <code role = "attrname">writing-mode</code>,
or alternatively may consist of a graphic element. </p>
<p><termref def = "fm-block-area">Block-area</termref>s should not
be thought of as abstract entities which are "broken" across an <termref
    def = "fm-area-container">area-container</termref> boundary;
rather, at a container boundary a block-level formatting object
may generate two (or more) <termref def = "fm-block-area">block-area</termref>s.</p>
<p><termref def = "fm-block-area">Block-area</termref>s are always
stacked in the containing area.</p></item>
<item><p><termref def = "fm-line-area">Line-area</termref>s are
filled with <termref def = "fm-inline-area">inline-area</termref>s
and <termref def = "fm-inline-space">inline-space</termref>s in
a direction determined by the <code role = "attrname">writing-mode</code>.</p>
<p><termref def = "fm-line-area">Line-area</termref>s are always
stacked (placed sequentially and adjacent to one another, possibly separated
by display-spaces) in the containing <termref def = "fm-block-area">block-area</termref>.</p></item>
<item><p>An <termref def = "fm-inline-area">inline-area</termref> may
contain other <termref def = "fm-inline-area">inline-area</termref>s.
The lowest level <termref def = "fm-inline-area">inline-area</termref> commonly contains
a single character glyph image (and is then called a <termref
    def = "fm-glyph-area">glyph-area</termref>). An <termref
    def = "fm-inline-area">inline-area</termref> may have more complex
content (e.g. an in-line mathematical expression). </p>
<p><termref def = "fm-inline-area">Inline-area</termref>s should
not be thought of as abstract entities which are "broken" across
a line boundary; rather, at a line boundary an inline formatting
object may generate two (or more) <termref def = "fm-inline-area">inline-area</termref>s.</p>
<p><termref def = "fm-inline-area">Inline-area</termref>s are always
stacked (placed sequentially and adjacent to one another, possibly separated
by inline-spaces) in the containing area.</p></item></ulist>
<p>Rectangular areas have a number of common features. Each has
a <termref def = "fm-margin">margin</termref>, <termref
    def = "fm-border">border</termref>, and <termref def = "fm-padding">padding</termref>, defined
as follows.</p>
<ulist><item><p>A <termref def = "fm-border">border</termref> is
an open box surrounding the content of the area. A <termref
    def = "fm-border">border</termref> is specified in terms of
its color and of the thickness of each of its four sides. This thickness
may be specified as a range with minimum, optimum, and maximum values.</p></item>
<item><p><termref def = "fm-padding">Padding</termref> is the open
space between the inside of the <termref def = "fm-border">border</termref> and
the content of the area. It is specified by its thickness in each
of the four directions.</p></item>
<item><p>A <termref def = "fm-margin">margin</termref> is used to
determine the open space reserved between the outside of the <termref
    def = "fm-border">border</termref> of the rectangular area and
those of other rectangular areas. It is specified by its thickness in
each of the four directions, though only some of these may apply
in determining the <termref def = "fm-allocation-rectangle">allocation-rectangle</termref>,
described below.</p></item></ulist>
<ednote><edtext>&#60;INSERT ILLUSTRATION -- src="boxmodel.gif" alt="Box
model diagram" vspace=0 hspace=50 border=0> </edtext></ednote>
<p>By a rectangle we mean an open rectangle, consisting of four
edges. This model identifies a number of specific rectangles:</p>
<ulist><item><p>The <termref def = "fm-content-rectangle">content-rectangle</termref> of
a rectangular area is the rectangle surrounding the area's content. </p></item>
<item><p>The <termref def = "fm-padding">padding</termref> rectangle
surrounds the area's <termref def = "fm-padding">padding</termref>.
If the <termref def = "fm-padding">padding</termref> has 0 thickness,
the <termref def = "fm-padding">padding</termref> rectangle is the
same as the <termref def = "fm-content-rectangle">content-rectangle</termref>. </p></item>
<item><p>The <termref def = "fm-border">border</termref> rectangle
surrounds the area's <termref def = "fm-border">border</termref>.
If the <termref def = "fm-border">border</termref> has 0 width,
the <termref def = "fm-border">border</termref> rectangle is the
same as the <termref def = "fm-padding">padding</termref> rectangle. </p></item>
<item><p>The <termref def = "fm-margin">margin</termref> rectangle
surrounds the area's <termref def = "fm-margin">margin</termref>.
If the <termref def = "fm-margin">margin</termref> has 0 width,
the <termref def = "fm-margin">margin</termref> rectangle is the
same as the <termref def = "fm-border">border</termref> rectangle. </p></item></ulist>
<p>All rectangular areas have properties which are either specified
(explicitly) or derived. <termref def = "fm-margin">Margin</termref>, <termref
    def = "fm-border">border</termref> and <termref def = "fm-padding">padding</termref> specifications
are specified properties.</p>
<p>Among the properties of areas are the <code role = "attrname">writing-mode</code>.
This determines the way glyphs are aligned (called the <code
    role = "attrname">glyph-alignment-mode</code>), and several
directions used for rectangular area placement:</p>
<ulist><item><p><termref def = "fm-block-progression-direction">block-progression-direction</termref>:
the direction of progression of sequential <termref
    def = "fm-block-area">block-area</termref>s within an <termref
    def = "fm-area-container">area-container</termref>.</p></item>
<item><p><termref def = "fm-line-progression-direction">line-progression-direction</termref>:
the direction of progression of sequential <termref def = "fm-line-area">line-area</termref>s
within a <termref def = "fm-block-area">block-area</termref>. This
is usually the same as the block-progression-direction but may sometimes be
opposite to the block-progression-direction.</p></item>
<item><p><termref def = "fm-inline-progression-direction">inline-progression-direction</termref>:
the direction of progression of sequential <termref
    def = "fm-inline-area">inline-area</termref>s within a <termref
    def = "fm-line-area">line-area</termref>. This is always perpendicular
to the <termref def = "fm-line-progression-direction">line-progression-direction</termref>.</p></item>
<item><p><termref def = "fm-escapement-progression-direction">escapement-progression-direction</termref>:
the direction of progression of sequential <termref
    def = "fm-glyph-area">glyph-area</termref>s within an <termref
    def = "fm-inline-area">inline-area</termref>. This is usually
the same as the inline-progression-direction but may sometimes be
opposite to the inline-progression-direction.</p></item></ulist>
<p><termref def = "fm-inline-area">Inline-area</termref>s have a
designated <termref def = "fm-position-point">position-point</termref>.
We will define the <termref def = "fm-descender-depth">descender-depth</termref> of
a <termref def = "fm-glyph-area">glyph-area</termref> to be how
far it extends in the <termref def = "fm-line-progression-direction">line-progression-direction</termref> from
the <termref def = "fm-position-point">position-point</termref>,
and the <termref def = "fm-ascender-height">ascender-height</termref> to
be how far it extends in the opposite direction. Similar definitions
may be made for more complex <termref def = "fm-inline-area">inline-area</termref>s.</p>
<p>The edges of any rectangle associated with a rectangular area
are identified by their relative direction, based on the <code
    role = "attrname">writing-mode</code>. </p>
<ulist><item><p>The edge occurring first in the <termref
    def = "fm-block-progression-direction">block-progression-direction</termref> or
the <termref def = "fm-line-progression-direction">line-progression-direction</termref> (as
applicable) and perpendicular to it is called the <termref
    def = "fm-before-edge">before-edge</termref> of the rectangle. The
opposite edge is the <termref def = "fm-after-edge">after-edge</termref>. </p></item>
<item><p>The edge occurring first in the <termref
    def = "fm-inline-progression-direction">inline-progression-direction</termref> or
the <termref def = "fm-escapement-progression-direction">escapement-progression-direction</termref> (as
applicable) is called the <termref def = "fm-start-edge">start-edge</termref> of
the rectangle. The opposite edge is called the <termref
    def = "fm-end-edge">end-edge</termref>. </p></item></ulist>
<p>In European writing systems, these are the "top" and "bottom"
edges, and "left" and "right" edges, respectively, and "<termref
    def = "fm-ascender-height">ascender-height</termref>" and "<termref
    def = "fm-descender-depth">descender-depth</termref>" have their
usual meanings.</p>
<p>Two rectangles associated to a rectangular area are of particular
significance:</p>
<ulist><item><p>The <termref def = "fm-content-rectangle">content-rectangle</termref> bounds
the portion of the area in which the <termref
    def = "fm-allocation-rectangle">allocation-rectangle</termref>s
of smaller areas may appear. It is possible for marks associated
with an area to be found outside the <termref
    def = "fm-content-rectangle">content-rectangle</termref>, but
these are considered decoration and are deemed not to take up area.</p></item>
<item><p>The <termref def = "fm-allocation-rectangle">allocation-rectangle</termref> bounds
the portion of the area which is used to allocate space when placing
the area inside a larger area. When we speak of an area's "size"
we are normally referring to the dimensions of its <termref
    def = "fm-allocation-rectangle">allocation-rectangle</termref>.</p>
<p>For <termref def = "fm-area-container">area-container</termref>s
the <termref def = "fm-allocation-rectangle">allocation-rectangle</termref> extends
as far as the <termref def = "fm-border">border</termref> rectangle
in the <termref def = "fm-block-progression-direction">block-progression-direction</termref>,
and as far as the <termref def = "fm-margin">margin</termref> rectangle
in the perpendicular direction.</p>
<p>For all other rectangular areas, the <termref
    def = "fm-allocation-rectangle">allocation-rectangle</termref> extends
to the <termref def = "fm-margin">margin</termref> rectangle in the <termref
    def = "fm-inline-progression-direction">inline-progression-direction</termref>.
For <termref def = "fm-block-area">block-area</termref>s it extends
to the <termref def = "fm-border">border</termref> rectangle in
the <termref def = "fm-line-progression-direction">line-progression-direction</termref>,
and for <termref def = "fm-line-area">line-area</termref>s and <termref
    def = "fm-inline-area">inline-area</termref>s, it extends only
to the <termref def = "fm-content-rectangle">content-rectangle</termref> in
that direction.</p></item></ulist>
<ednote><edtext>&#60;INSERT ILLUSTRATION -- src="bcontent.gif" alt="Block-level
content &#38; allocation rectangle" vspace=0 hspace=50 border=0></edtext></ednote>
<ednote><edtext>&#60;INSERT ILLUSTRATION -- src="lcontent.gif" alt="Inline-level
content &#38; allocation rectangle" vspace=0 hspace=50 border=0></edtext></ednote></div3>
<div3><head>Display-spaces</head>
<p><termref def = "fm-display-space">Display-space</termref>s are
blank space assigned preceding and following <termref
    def = "fm-line-area">line-area</termref>s and <termref
    def = "fm-block-area">block-area</termref>s to control their
placement. They are assigned either automatically by the formatter
or as otherwise specified.</p>
<p>A <termref def = "fm-display-space">display-space</termref> between
two areas (block or line) is specified by a triple of values (minimum, optimum,
maximum) which defines the limits of how the space may be transformed
by later processes such as vertical justification. In the absence
of further processing, the two areas will be separated by the optimum
value, but such processing may reduce it as small as the specified minimum
or stretch it as large as the specified maximum.</p>
<p>A <termref def = "fm-display-space">display-space</termref> is
thought of as having a <termref def = "fm-before-edge">before-edge</termref> and <termref
    def = "fm-after-edge">after-edge</termref> separated in the <termref
    def = "fm-block-progression-direction">block-progression-direction</termref> or
 <termref def = "fm-line-progression-direction">line-progression-direction</termref> by
the <termref def = "fm-display-space">display-space</termref>'s
value. A <termref def = "fm-display-space">display-space</termref> value
may be negative, which can cause areas to overlap.</p>
<p>When two or more <termref def = "fm-display-space">display-space</termref>s
are adjacent, they shall be resolved into a single <termref
    def = "fm-display-space">display-space</termref> whose minimum,
optimum and maximum values are derived according to the <termref
    def = "fm-space-resolution-rules">space-resolution-rules</termref>,
as described below. These depend on certain specified properties
of the <termref def = "fm-display-space">display-space</termref>, namely <termref
    def = "fm-conditionality">conditionality</termref> and <termref
    def = "fm-precedence">precedence</termref>. </p>
<ulist><item><p><termref def = "fm-conditionality">Conditionality</termref> is
a Boolean value which specifies whether the space persists at the beginning
or end of an <termref def = "fm-area-container">area-container</termref>.
If true, the space is called a <termref def = "fm-conditional-space">conditional-space</termref> and
is always omitted if it appears at the <termref def = "fm-before-edge">before-edge</termref> or <termref
    def = "fm-after-edge">after-edge</termref> of the <termref
    def = "fm-content-rectangle">content-rectangle</termref> of
an <termref def = "fm-area-container">area-container</termref>;
in this case any immediately succeeding <termref
    def = "fm-conditional-space">conditional-space</termref>s are
also omitted. </p></item>
<item><p><termref def = "fm-precedence">Precedence</termref> has
a value which is either an integer or the special token "force".
A space with a <termref def = "fm-precedence">precedence</termref> value
of "force" is called a forcing space.</p></item></ulist>
<p><termref def = "fm-space-resolution-rules">Space-resolution-rules</termref>.
When several spaces are assigned to be adjacent, they are resolved
into a single space as follows:</p>
<olist><item><p>At the beginning or end of an <termref
    def = "fm-area-container">area-container</termref>, any <termref
    def = "fm-conditional-space">conditional-space</termref>s are
omitted if this has not already been done.</p></item>
<item><p>Then, if any space is forcing, the resolved space is taken
to be the sum of all the forcing spaces, and all non-forcing spaces
are suppressed.</p></item>
<item><p>If all spaces are non-forcing, then the eligible spaces
shall be those with the maximum <termref def = "fm-precedence">precedence</termref>,
and among these, the space or spaces having the greatest optimum
value. All other spaces are suppressed. The resolved space is taken
to have the same optimum value as the eligible spaces; its minimum
value shall be the greatest of the minimum values of the eligible
spaces, and its maximum value shall be the least of the maximum
values. </p></item></olist>
<p>A <termref def = "fm-display-space">display-space</termref> at
the <termref def = "fm-before-edge">before-edge</termref> or <termref
    def = "fm-after-edge">after-edge</termref> of the <termref
    def = "fm-content-rectangle">content-rectangle</termref> of
a <termref def = "fm-block-area">block-area</termref> is combined
with the <termref def = "fm-padding">padding</termref> of the <termref
    def = "fm-block-area">block-area</termref> in that direction
according to the <termref def = "fm-space-resolution-rules">space-resolution-rules</termref>,
except that the resolved <termref def = "fm-display-space">display-space</termref> is
never resolved to be smaller than the <termref def = "fm-padding">padding</termref>.</p>
<ednote><edtext>The border or padding associated with a rectangular
area may be specified as conditional. For purposes of conditionality,
if the border or padding of the area are non-zero and not omitted,
then the initial space within the area's content rectangle is not
at the beginning of an area container (and so is not omitted in
step 1).</edtext></ednote></div3>
<div3><head>Inline-spaces</head>
<p><termref def = "fm-inline-space">Inline-space</termref>s are
blank space assigned preceding and following <termref
    def = "fm-inline-area">inline-area</termref>s. They are assigned either
automatically by the formatter (e.g. for word spacing, letterspacing,
or kerning) or as otherwise specified. </p>
<p>An <termref def = "fm-inline-space">inline-space</termref> is
specified by a triple of values (minimum, optimum, maximum) which
defines the limits of how the space may be transformed by later
processes such as justification. It separates <termref
    def = "fm-inline-area">inline-area</termref>s in a direct analogy
to the way <termref def = "fm-display-space">display-space</termref> separates <termref
    def = "fm-block-area">block-area</termref>s.</p>
<p>An <termref def = "fm-inline-space">inline-space</termref> is
thought of as having a <termref def = "fm-start-edge">start-edge</termref> and <termref
    def = "fm-end-edge">end-edge</termref>, separated in the <termref
    def = "fm-inline-progression-direction">inline-progression-direction</termref> by
the <termref def = "fm-inline-space">inline-space</termref>'s value.
An <termref def = "fm-inline-space">inline-space</termref> value
may be negative, which can cause <termref def = "fm-inline-area">inline-area</termref>s
to overlap.</p>
<p><termref def = "fm-inline-space">Inline-space</termref>s have <termref
    def = "fm-conditionality">conditionality</termref> and <termref
    def = "fm-precedence">precedence</termref>. Conditional <termref
    def = "fm-inline-space">inline-space</termref>s are omitted
at the start and end of a <termref def = "fm-line-area">line-area</termref>.
When multiple <termref def = "fm-inline-space">inline-space</termref>s
are assigned to be adjacent, they are resolved in accordance with
the <termref def = "fm-space-resolution-rules">space-resolution-rules</termref>.</p>
<ednote><edtext>Most formatters have built-in algorithms for the
handling of word-spacing, letter-spacing, kerning, and combinations
thereof; although this model describes these features using inline-spaces
and space-resolution-rules, it is not the intent of this standard
to demand replacement of the formatter's built-in algorithms.</edtext></ednote></div3>
<div3><head>Area containers</head>
<p>An <termref def = "fm-area-container">area-container</termref> defines
a coordinate system for its content, which may be oriented differently from
that of its containing area.</p>
<p>The <termref def = "fm-block-progression-direction">block-progression-direction</termref> of
an <termref def = "fm-area-container">area-container</termref> is
derived from its coordinate system and its <code role = "attrname">writing-mode</code>,
and controls the orientation and placement of <termref
    def = "fm-block-area">block-area</termref>s in the <termref
    def = "fm-area-container">area-container</termref>.</p>
<p>The <termref def = "fm-allocation-rectangle">allocation-rectangle</termref> of
an <termref def = "fm-area-container">area-container</termref> has
a fixed size in the direction perpendicular to its <termref
    def = "fm-block-progression-direction">block-progression-direction</termref>,
and may have a fixed size in the <termref
    def = "fm-block-progression-direction">block-progression-direction</termref>,
or may grow to accommodate its content.</p>
<p><termref def = "fm-area-container">Area-container</termref>s
may directly contain smaller <termref def = "fm-area-container">area-container</termref>s,
or alternatively may be filled with <termref def = "fm-block-area">block-area</termref>s. <termref
    def = "fm-area-container">Area-container</termref>s may be directly
contained in larger <termref def = "fm-area-container">area-container</termref>s, <termref
    def = "fm-block-area">block-area</termref>s, or <termref
    def = "fm-inline-area">inline-area</termref>s, or may be uncontained
(e.g. a page area).</p></div3>
<div3><head>Block-areas</head>
<p>A <termref def = "fm-block-area">block-area</termref>'s <termref
    def = "fm-margin">margin</termref>s, <termref def = "fm-border">border</termref>s,
and <termref def = "fm-padding">padding</termref> are specified
by the formatter based on the properties of its generating flow
object.</p>
<p>A <termref def = "fm-block-area">block-area</termref>'s <code
    role = "attrname">writing-mode</code> is specified by the formatter
(though the formatter may choose to derive the value from its containing
area). This determines its <termref
    def = "fm-line-progression-direction">line-progression-direction</termref>, which
controls the orientation and placement of <termref def = "fm-line-area">line-area</termref>s
in its <termref def = "fm-content-rectangle">content-rectangle</termref>,
and its <termref def = "fm-inline-progression-direction">inline-progression-direction</termref>,
which is used to determine the direction of writing within contained <termref
    def = "fm-line-area">line-area</termref>s.</p>
<p><termref def = "fm-block-area">Block-area</termref>s also have
a specified <termref def = "fm-nominal-font">nominal-font</termref> (a
fully qualified font name and font size), which is used by the formatter
to establish a default font for the block-area's directly contained <termref
    def = "fm-line-area">line-area</termref>s and <termref
    def = "fm-block-area">block-area</termref>s, but may be overridden.
Other properties include <code role = "attrname">line-height</code> (the nominal
distance between the <termref def = "fm-before-edge">before-edge</termref>s
of successive <termref def = "fm-line-area">line-area</termref>s), <code
    role = "attrname">minimum-leading</code> (the minimum space
allowed between <termref def = "fm-line-area">line-area</termref>s),
and space-before and space-after specifications (which may be identified
with the specifications for before- and after-<termref def = "fm-margin">margin</termref>s).</p>
<p>A derived property of a <termref def = "fm-block-area">block-area</termref> is
its <termref def = "fm-nominal-glyph-height">nominal-glyph-height</termref>,
which is the distance from the maximum <termref
    def = "fm-ascender-height">ascender-height</termref> to the
maximum descender depth of the <termref def = "fm-glyph-area">glyph-area</termref>s
of the <termref def = "fm-nominal-font">nominal-font</termref>.
This is a property of the <termref def = "fm-nominal-font">nominal-font</termref> and
is not dependent on which glyphs are actually present in the <termref
    def = "fm-block-area">block-area</termref>.</p>
<p>The <termref def = "fm-allocation-rectangle">allocation-rectangle</termref> of
a <termref def = "fm-block-area">block-area</termref> has fixed
size in the <termref def = "fm-inline-progression-direction">inline-progression-direction</termref>,
and varies in the <termref def = "fm-line-progression-direction">line-progression-direction</termref> to
accommodate its content, though this may not grow outside the <termref
    def = "fm-content-rectangle">content-rectangle</termref> of
its containing area. (The <code role = "attrname">overflow</code> property
does allow the content to exceed the <termref
    def = "fm-allocation-rectangle">allocation-rectangle</termref> under
limited circumstances. The overflowing data is considered decoration
and is not considered as part of the layout. Overflowing data may
be clipped or may overprint content in other areas.) A <termref
    def = "fm-block-area">block-area</termref> consisting of a graphic
element has fixed size in both directions. </p>
<p>A <termref def = "fm-block-area">block-area</termref> may directly
contain <termref def = "fm-line-area">line-area</termref>s, <termref
    def = "fm-display-space">display-space</termref>s, and nested <termref
    def = "fm-block-area">block-area</termref>s, or may consist
of a graphic element. <termref def = "fm-block-area">Block-area</termref>s
may be directly contained in <termref def = "fm-area-container">area-container</termref>s
and higher-level <termref def = "fm-block-area">block-area</termref>s.</p></div3>
<div3><head>Line-areas</head>
<p>There is no formatting-object that directly corresponds to a <termref
    def = "fm-line-area">line-area</termref>. Thus, <termref
    def = "fm-line-area">line-area</termref>s are always created
by the formatter. A <termref def = "fm-line-area">line-area</termref>'s <termref
    def = "fm-margin">margin</termref>s, <termref def = "fm-border">border</termref>s,
and <termref def = "fm-padding">padding</termref> are derived by
the formatter from the settings on the containing area.</p>
<p>A <termref def = "fm-line-area">line-area</termref> also derives
its <termref def = "fm-inline-progression-direction">inline-progression-direction</termref> from
its containing <termref def = "fm-block-area">block-area</termref>,
and this is used to determine the direction of writing within a
line. It also derives its <code role = "attrname">line-height</code> and <code
    role = "attrname">minimum-leading</code> properties, as well
as its <termref def = "fm-nominal-font">nominal-font</termref>,
which is used to derive its <termref def = "fm-nominal-glyph-height">nominal-glyph-height</termref>.</p>
<p>The <termref def = "fm-allocation-rectangle">allocation-rectangle</termref> of
a line is determined by the presence or absence of the <code
    role = "attrname">minimum-leading</code> property: if absent,
the <termref def = "fm-allocation-rectangle">allocation-rectangle</termref> is
the <termref role = "fm-nominal-line-rectangle"
    def = "fm-nominal-requested-line-rectangle">nominal-requested-line-rectangle</termref>; if
present, it is the <termref def = "fm-maximum-line-rectangle">maximum-line-rectangle</termref>,
as described below.</p>
<p>The <termref role = "fm-nominal-line-rectangle"
    def = "fm-nominal-requested-line-rectangle">nominal-requested-line-rectangle</termref> for
a <termref def = "fm-line-area">line-area</termref> is the rectangle
bounded in the <termref def = "fm-inline-progression-direction">inline-progression-direction</termref> by
the <termref def = "fm-content-rectangle">content-rectangle</termref> of
the containing <termref def = "fm-block-area">block-area</termref>,
as modified by typographic properties such as indents, and in the
perpendicular direction by its <termref def = "fm-nominal-glyph-height">nominal-glyph-height</termref>.
It has the same height for each line in a <termref def = "fm-block-area">block-area</termref>.</p>
<p>The <termref def = "fm-maximum-line-rectangle">maximum-line-rectangle</termref> for
a line has the same length as the <termref
    role = "fm-nominal-line-rectangle"
    def = "fm-nominal-requested-line-rectangle">nominal-requested-line-rectangle</termref> in
the <termref def = "fm-inline-progression-direction">inline-progression-direction</termref>.
In the perpendicular direction it is bounded by the maximum <termref
    def = "fm-ascender-height">ascender-height</termref> and the
maximum <termref def = "fm-descender-depth">descender-depth</termref> for
the actual fonts and <termref def = "fm-inline-area">inline-area</termref>s
placed on the line, as raised and lowered by <code role = "attrname">vertical-align</code> and
other adjustments perpendicular to the <termref
    def = "fm-inline-progression-direction">inline-progression-direction</termref>.
Its height may vary depending on the contents of the <termref
    def = "fm-line-area">line-area</termref>.</p>
<ednote><edtext>&#60;INSERT ILLUSTRATION -- src="linerect.gif" alt="Nominal
and Maximum line rectangles" vspace=0 hspace=50 border=0> </edtext></ednote>
<p>The <termref def = "fm-nominal-font">nominal-font</termref> is
always deemed to occur on a line, and thus the <termref
    def = "fm-maximum-line-rectangle">maximum-line-rectangle</termref> always
contains the <termref role = "fm-nominal-line-rectangle"
    def = "fm-nominal-requested-line-rectangle">nominal-requested-line-rectangle</termref>.</p>
<p><termref def = "fm-inline-area">Inline-area</termref>s are placed
within a <termref def = "fm-line-area">line-area</termref> relative
to a <termref def = "fm-placement-point">placement-point</termref> .
This varies during the placement process, but initially the <termref
    def = "fm-placement-point">placement-point</termref> is a point
on the <termref def = "fm-start-edge">start-edge</termref> of its <termref
    def = "fm-content-rectangle">content-rectangle</termref>, separated
from the <termref def = "fm-before-edge">before-edge</termref> of
the <termref role = "fm-nominal-line-rectangle"
    def = "fm-nominal-requested-line-rectangle">nominal-requested-line-rectangle</termref> by
a distance equal to the <termref def = "fm-ascender-height">ascender-height</termref> for
the <termref def = "fm-nominal-font">nominal-font</termref>.</p>
<p><termref def = "fm-line-area">Line-area</termref>s may directly
contain <termref def = "fm-inline-area">inline-area</termref>s and <termref
    def = "fm-inline-space">inline-space</termref>s. They may be
directly contained in <termref def = "fm-block-area">block-area</termref>s.</p>
<ednote><edtext>We may require special-casing rules for the maximum
line rectangle in cases such as "accented" strings in mathematics,
or ruby or non-spacing superiors.</edtext></ednote></div3>
<div3><head>Inline-areas</head>
<p>The most common <termref def = "fm-inline-area">inline-area</termref> is
a <termref def = "fm-glyph-area">glyph-area</termref>, which contains
the representation for a character in a particular font. Other examples
of <termref def = "fm-inline-area">inline-area</termref>s might
include portions of inline mathematical expressions.</p>
<p><termref def = "fm-inline-area">Inline-area</termref>s have <termref
    def = "fm-margin">margin</termref>s, <termref def = "fm-border">border</termref>s,
and <termref def = "fm-padding">padding</termref>, specified by
the formatter. (The <termref def = "fm-margin">margin</termref>s before
and after an <termref def = "fm-inline-area">inline-area</termref> are
disregarded in determining the size of its <termref
    def = "fm-allocation-rectangle">allocation-rectangle</termref>. However, <termref
    def = "fm-margin">margin</termref>s at the <termref
    def = "fm-start-edge">start-edge</termref> and <termref
    def = "fm-end-edge">end-edge</termref> are incorporated into
the <termref def = "fm-allocation-rectangle">allocation-rectangle</termref>.) </p>
<p>The <termref def = "fm-allocation-rectangle">allocation-rectangle</termref> for
an <termref def = "fm-inline-area">inline-area</termref> has a fixed
size in both dimensions, though this may be specified as a range
within which the size may be modified by further processes such
as justification. An <termref def = "fm-inline-area">inline-area</termref> also
has a font, which is derived from the containing area (if not explicitly
set on the inline-area).</p>
<p>Each <termref def = "fm-inline-area">inline-area</termref> has
a designated <termref def = "fm-position-point">position-point</termref> on
one of the edges of its <termref def = "fm-allocation-rectangle">allocation-rectangle</termref> (typically
the <termref def = "fm-start-edge">start-edge</termref>). On the
opposite edge of the <termref def = "fm-allocation-rectangle">allocation-rectangle</termref> there
is another point called the <termref def = "fm-escapement-point">escapement-point</termref>,
and the vector from the <termref def = "fm-position-point">position-point</termref> to
the <termref def = "fm-escapement-point">escapement-point</termref> is called
the <termref def = "fm-escapement-vector">escapement-vector</termref>.</p>
<p>The <termref def = "fm-position-point">position-point</termref> and <termref
    def = "fm-escapement-point">escapement-point</termref> are assigned
according to the <code role = "attrname">writing-system</code> in use
(e.g. the glyph baseline in European languages) and the current <termref
    def = "fm-escapement-progression-direction">escapement-progression-direction</termref> in
effect for bidirectional text. These points may be futher adjusted
in the case of mixed-language formatting involving different <code
    role = "attrname">glyph-alignment-mode</code>s.</p>
<p>A <termref def = "fm-glyph-area">glyph-area</termref> is atomic
and may contain no other areas. An <termref def = "fm-inline-area">inline-area</termref> may
be atomic and contain no other areas, or may be non-atomic and contain
an <termref def = "fm-area-container">area-container</termref> (such
as for an inline-graphic), a <termref def = "fm-block-area">block-area</termref> or
other <termref def = "fm-inline-area">inline-area</termref>s. <termref
    def = "fm-inline-area">Inline-area</termref>s may be directly
contained only in <termref def = "fm-line-area">line-area</termref>s
or in other <termref def = "fm-inline-area">inline-area</termref>s.</p></div3>
<div3><head>Inline-area placement within a line-area</head>
<p>The formatter constructs a series of <termref def = "fm-inline-area">inline-area</termref>s
and assigns these to <termref def = "fm-line-area">line-area</termref>s
according to its line-breaking algorithm. </p>
<p><termref def = "fm-inline-area">Inline-area</termref>s assigned
to a <termref def = "fm-line-area">line-area</termref> are placed
in the <termref def = "fm-line-area">line-area</termref> in their
display order (which may be different from the logical order, when <code
    role = "attrname">writing-system</code>s are mixed).</p>
<p>Before an <termref def = "fm-inline-area">inline-area</termref> is
placed, the <termref def = "fm-placement-point">placement-point</termref> of
the <termref def = "fm-line-area">line-area</termref> may be adjusted
by shifts perpendicular to the <termref
    def = "fm-inline-progression-direction">inline-progression-direction</termref> (e.g.
for subscript and superscript, or to allow for glyphs with a different
natural alignment from the <termref def = "fm-line-area">line-area</termref>'s
glyph-alignment mode). </p>
<p>Each <termref def = "fm-inline-area">inline-area</termref> is
oriented so that the direction of its <termref def = "fm-position-point">escapement-vector</termref> matches
the <termref def = "fm-escapement-progression-direction">escapement-progression-direction</termref>,
and is placed so that its <termref def = "fm-position-point">position-point</termref> matches
the current <termref def = "fm-placement-point">placement-point</termref> of
the <termref def = "fm-line-area">line-area</termref>. The <termref
    def = "fm-escapement-point">escapement-point</termref> of the <termref
    def = "fm-inline-area">inline-area</termref> then becomes the
new <termref def = "fm-placement-point">placement-point</termref>.</p>
<p>Each <termref def = "fm-inline-space">inline-space</termref> is
placed so that its <termref def = "fm-start-edge">start-edge</termref> intersects
the current <termref def = "fm-placement-point">placement-point</termref>,
and the <termref def = "fm-placement-point">placement-point</termref> is
translated in the <termref def = "fm-inline-progression-direction">inline-progression-direction</termref>,
to the <termref def = "fm-end-edge">end-edge</termref> of the <termref
    def = "fm-inline-space">inline-space</termref>. Adjacent spaces
are combined according to the <termref def = "fm-space-resolution-rules">space-resolution-rules</termref>.
A <termref def = "fm-conditional-space">conditional-space</termref> is
not placed if it is at the <termref def = "fm-start-edge">start-edge</termref> of
the <termref def = "fm-content-rectangle">content-rectangle</termref> of
a <termref def = "fm-line-area">line-area</termref>, but may be placed
if it follows a <termref def = "fm-conditional-space">non-conditional-space</termref> there.
Similarly a <termref def = "fm-conditional-space">conditional-space</termref> is
not placed if it is at the end of a <termref def = "fm-line-area">line-area</termref>,
but may be placed if it precedes a <termref def = "fm-conditional-space">non-conditional-space</termref> there.</p>
<ednote><edtext>In bidirectional text, the display order is generated
according to the basic algorithm for display of bidirectional text
in the Unicode Standard, version 2.1.</edtext></ednote></div3>
<div3><head>Line-area placement within a block-area</head>
<p>Preceding and following each <termref def = "fm-line-area">line-area</termref> assigned
to a <termref def = "fm-block-area">block-area</termref>, the formatter
assigns <termref def = "fm-display-space">display-space</termref>s,
whose <termref def = "fm-conditionality">conditionality</termref> and <termref
    def = "fm-precedence">precedence</termref> are determined by
the generating flow object. </p>
<p>The values of these <termref def = "fm-display-space">display-space</termref>s
are determined by the presence or absence of the <code role = "attrname">minimum-leading</code> property.
If <code role = "attrname">minimum-leading</code> is present then
the value of each is equal to half the value of <code role = "attrname">minimum-leading</code>.
Otherwise it is equal to half of the difference between the <code
    role = "attrname">line-height</code> and <termref
    def = "fm-nominal-glyph-height">nominal-glyph-height</termref>,
as derived from the containing <termref def = "fm-block-area">block-area</termref> (if
not set explicitly on the inline-area).</p>
<p>Each <termref def = "fm-display-space">display-space</termref> is
placed so that its <termref def = "fm-before-edge">before-edge</termref> coincides
with the <termref def = "fm-after-edge">after-edge</termref> of
the <termref def = "fm-allocation-rectangle">allocation-rectangle</termref> of
the previous <termref def = "fm-block-area">block-area</termref> or <termref
    def = "fm-line-area">line-area</termref>. Adjacent spaces are
combined according to the <termref def = "fm-space-resolution-rules">space-resolution-rules</termref>.
A <termref def = "fm-conditional-space">conditional-space</termref> is
not placed if it is at the <termref def = "fm-before-edge">before-edge</termref> of
the <termref def = "fm-content-rectangle">content-rectangle</termref> of
an <termref def = "fm-area-container">area-container</termref>,
but may be placed if it follows a non-<termref
    def = "fm-conditional-space">conditional-space</termref> there.
Similarly a <termref def = "fm-conditional-space">conditional-space</termref> is
not placed at the <termref def = "fm-after-edge">after-edge</termref>,
but may be placed if it precedes a <termref def = "fm-conditional-space">non-conditional-space</termref> there.</p>
<p>Each <termref def = "fm-line-area">line-area</termref> is placed
so that the <termref def = "fm-before-edge">before-edge</termref> of
its <termref def = "fm-allocation-rectangle">allocation-rectangle</termref> matches
the <termref def = "fm-after-edge">after-edge</termref> of the previous <termref
    def = "fm-display-space">display-space</termref>, <termref
    def = "fm-line-area">line-area</termref>, or <termref
    def = "fm-block-area">block-area</termref>, or failing these,
the <termref def = "fm-before-edge">before-edge</termref> of the <termref
    def = "fm-content-rectangle">content-rectangle</termref> of
its containing <termref def = "fm-block-area">block-area</termref>.
The <termref def = "fm-start-edge">start-edge</termref> and <termref
    def = "fm-end-edge">end-edge</termref>s of the <termref
    def = "fm-allocation-rectangle">allocation-rectangle</termref> are
placed to coincide with corresponding edges of the <termref
    def = "fm-content-rectangle">content-rectangle</termref> of the
containing <termref def = "fm-block-area">block-area</termref>.</p>
<ednote><edtext>Future versions or extensions of the model may take
into account intrusions and runaround text.</edtext></ednote></div3>
<div3><head>Block-area placement</head>
<p>Preceding and following each <termref def = "fm-block-area">block-area</termref> assigned
to an <termref def = "fm-area-container">area-container</termref>,
or nested inside another <termref def = "fm-block-area">block-area</termref>,
the formatter assigns <termref def = "fm-display-space">display-space</termref>s,
whose height, <termref def = "fm-conditionality">conditionality</termref> and <termref
    def = "fm-precedence">precedence</termref> are determined in
accordance with its space-before and space-after properties, and
by other properties of the generating flow object.</p>
<p>Each <termref def = "fm-display-space">display-space</termref> is
placed so that its <termref def = "fm-before-edge">before-edge</termref> coincides
with the <termref def = "fm-after-edge">after-edge</termref> of
the <termref def = "fm-allocation-rectangle">allocation-rectangle</termref> of
the previous <termref def = "fm-block-area">block-area</termref> or <termref
    def = "fm-line-area">line-area</termref>. Adjacent spaces are
combined according to the <termref def = "fm-space-resolution-rules">space-resolution-rules</termref>.
A <termref def = "fm-conditional-space">conditional-space</termref> is
not placed if it is at the <termref def = "fm-before-edge">before-edge</termref> of
the <termref def = "fm-content-rectangle">content-rectangle</termref> of
an <termref def = "fm-area-container">area-container</termref>,
but may be placed if it follows a non-<termref
    def = "fm-conditional-space">conditional-space</termref> there,
and similarly for the <termref def = "fm-after-edge">after-edge</termref>. </p>
<p>Each <termref def = "fm-block-area">block-area</termref> is placed
so that the <termref def = "fm-before-edge">before-edge</termref> of
its <termref def = "fm-allocation-rectangle">allocation-rectangle</termref> matches
the <termref def = "fm-after-edge">after-edge</termref> of the previous <termref
    def = "fm-display-space">display-space</termref>, <termref
    def = "fm-line-area">line-area</termref>, or <termref
    def = "fm-block-area">block-area</termref>, or failing that,
the <termref def = "fm-before-edge">before-edge</termref> of the <termref
    def = "fm-content-rectangle">content-rectangle</termref> of
the containing <termref def = "fm-area-container">area-container</termref> or <termref
    def = "fm-block-area">block-area</termref>.</p>
<p>The <termref def = "fm-start-edge">start-edge</termref> and <termref
    def = "fm-end-edge">end-edge</termref>s of its <termref
    def = "fm-allocation-rectangle">allocation-rectangle</termref> are
placed to coincide with the corresponding edges of the <termref
    def = "fm-content-rectangle">content-rectangle</termref> of
the containing <termref def = "fm-block-area">block-area</termref> or <termref
    def = "fm-area-container">area-container</termref>. </p>
<p>In no case is the space between <termref def = "fm-block-area">block-area</termref>s
affected by the <termref def = "fm-display-space">display-space</termref>s
contained in those <termref def = "fm-block-area">block-area</termref>s,
or in particular by their specified values of <code role = "attrname">line-height</code>.</p>
<ednote><edtext>NOTE: We recognize that this requirement goes too
far and plan to change it to allow the merging of spaces from nested
block-areas, while still not allowing merging between a space-after
from a block with the half-leading before the first line of the
next block.</edtext></ednote></div3></div2>
<div2><head>Formatting Objects Summary</head><glist><gitem><label>basic-page-sequence</label><def><p>This object describes the general layout or layout sequencing for web page (both print and online).
</p></def></gitem><gitem><label>block</label><def><p>A block formatting object allows the formatter to create a block-level area that contains textlines.</p></def></gitem><gitem><label>character</label><def><p>The character formatting object is used when one needs to explicitly override a specific character or array of characters with a specific glyph.
</p></def></gitem><gitem><label>display-graphic</label><def><p>Creates a block-level area that contains a graphic.
</p></def></gitem><gitem><label>display-link</label><def><p>A link that produces a block-level area.</p></def></gitem><gitem><label>display-rule</label><def><p>Produces a block-level rule (line).</p></def></gitem><gitem><label>display-sequence</label><def><p>A display-sequence is used to group block-level flow objects and to assign inherited properties to be shared across them.</p></def></gitem><gitem><label>inline-graphic</label><def><p>Creates a inline area that contains a graphic.
</p></def></gitem><gitem><label>inline-link</label><def><p>A link that produces an inline area.</p></def></gitem><gitem><label>inline-rule</label><def><p>Produces a inline rule (line).</p></def></gitem><gitem><label>inline-sequence</label><def><p>An inline-sequence is used to group inline flow objects and to assign inherited properties to be shared across them. </p></def></gitem><gitem><label>link-end-locator</label><def><p>Represents a target for link.</p></def></gitem><gitem><label>list-block</label><def><p>Creates a block-level area containing a list.</p></def></gitem><gitem><label>list-item</label><def><p>A list-item flow object contains the label and the body of each item; it may be used for overriding and modifying some of the list's properties on a case by case basis.</p></def></gitem><gitem><label>list-item-body</label><def><p>The item-body flow object holds the components (usually blocks) for a list item.
It controls styling defaults for the body, the spacing between lines and between paras within the list item, break precedences for line and paragraphs within the list item.
</p></def></gitem><gitem><label>list-item-label</label><def><p>A list-item-label is used to either enumerate, identify or adorn the list-item's body.</p></def></gitem><gitem><label>page-number</label><def><p>This object is used to instruct the formatter to construct and present a page-number. </p></def></gitem><gitem><label>queue</label><def><p>A queue is used to gather content flow objects to be assigned to (placed into) a given area or set of chained-areas.
</p></def></gitem><gitem><label>simple-page-master</label><def><p>A simple-page-master formatting object defines the layout of a page area. Masters may be repeated in accordance with the page-sequence specification.</p></def></gitem></glist></div2><div2><head>Formatting Objects</head><div3><head>fo:basic-page-sequence</head><div4><head>Purpose</head><p>This object describes the general layout or layout sequencing for web page (both print and online).
</p>
</div4><div4><head>Description</head>
<p>A basic-page-sequence holds:</p>
<ulist>
<item><p>a number of child simple-page-masters that define the layouts to be used for this sequence.</p></item>
<item><p>a number of child queues which hold the content to be placed in this sequence.</p></item>
</ulist>
<note><p>A document can contain multiple basic-page-sequences. For example, each chapter of a document could be a separate basic-page-sequence; this would allow the chapter title within a header or footer.</p></note>

</div4><div4><head>Properties</head><slist><sitem>id : <specref ref='id'/></sitem>
<sitem>first-page-master : <specref ref='first-page-master'/></sitem>
</slist></div4>
</div3>
<div3><head>fo:block</head><div4><head>Purpose</head><p>A block formatting object allows the formatter to create a block-level area that contains textlines.</p>

</div4><div4><head>Description</head><p>
This object is commonly used for formatting paragraphs, titles, headlines, figure and table captions, etc.  It normally specifies a rectangular area that occupies the width of the containing area and a height that is determined by the amount of text that the block contains.  A block may specify separation between it and a preceding block-level object or subsequent block-level object as well as unique indents on the start of the first textline of the block and end of the last textline of the block.
</p>
<p>A block directly contains its children, which may be a mixture of inline or block-level formatting objects:</p>
<ulist>
<item><p>Inline child formatting objects within a block are formatted to produce one or more textline areas. Multiple inline objects may be placed successively into a single textline. Inline objects may (or may not) be split across two or more textlines if necessary (and if allowed to split) if the inline does not fit in the remaining space in the textline.
</p></item>
<item><p>
Block-level child formatting objects within a block implicitly specify line-breaks before and after the block-level object. Each child block-level produces a single area which is treated by the formatter of the block as if it were a textline area. These areas shall be added to the resulting sequence of areas within the block.
</p></item>
</ulist>
<note><p>This specifies that users may nest a block inside another block. When this happens the outer block does not end before the nested block, it is simply suspended. The normal mid-block quadding and indents apply to the last textline prior to the nested block's area. Similarly, the outer block resumes after the nested block without a new first-textline indent.</p></note>
<note><p>Typically, a break implies that a new textline is to be started. 
The shift-direction for inline areas in the block is the reverse of the line-progression-direction of the block.</p></note>

</div4><div4><head>Properties</head><slist><sitem>background-attachment : <specref ref='background-attachment'/></sitem>
<sitem>background-color : <specref ref='background-color'/></sitem>
<sitem>background-image : <specref ref='background-image'/></sitem>
<sitem>background-position : <specref ref='background-position'/></sitem>
<sitem>background-repeat : <specref ref='background-repeat'/></sitem>
<sitem>border-color-top : <specref ref='border-color-top'/></sitem>
<sitem>border-color-bottom : <specref ref='border-color-bottom'/></sitem>
<sitem>border-color-left : <specref ref='border-color-left'/></sitem>
<sitem>border-color-right : <specref ref='border-color-right'/></sitem>
<sitem>border-color-before : <specref ref='border-color-before'/></sitem>
<sitem>border-color-after : <specref ref='border-color-after'/></sitem>
<sitem>border-color-start : <specref ref='border-color-start'/></sitem>
<sitem>border-color-end : <specref ref='border-color-end'/></sitem>
<sitem>border-width-top : <specref ref='border-width-top'/></sitem>
<sitem>border-width-bottom : <specref ref='border-width-bottom'/></sitem>
<sitem>border-width-left : <specref ref='border-width-left'/></sitem>
<sitem>border-width-right : <specref ref='border-width-right'/></sitem>
<sitem>border-width-before : <specref ref='border-width-before'/></sitem>
<sitem>border-width-after : <specref ref='border-width-after'/></sitem>
<sitem>border-width-start : <specref ref='border-width-start'/></sitem>
<sitem>border-width-end : <specref ref='border-width-end'/></sitem>
<sitem>break-before : <specref ref='break-before'/></sitem>
<sitem>break-after : <specref ref='break-after'/></sitem>
<sitem>font-family : <specref ref='font-family'/></sitem>
<sitem>system-font : <specref ref='system-font'/></sitem>
<sitem>font-size : <specref ref='font-size'/></sitem>
<sitem>font-size-adjust : <specref ref='font-size-adjust'/></sitem>
<sitem>font-stretch : <specref ref='font-stretch'/></sitem>
<sitem>font-style : <specref ref='font-style'/></sitem>
<sitem>font-variant : <specref ref='font-variant'/></sitem>
<sitem>font-weight : <specref ref='font-weight'/></sitem>
<sitem>glyph-alignment-mode : <specref ref='glyph-alignment-mode'/></sitem>
<sitem>hyphenation-keep : <specref ref='hyphenation-keep'/></sitem>
<sitem>id : <specref ref='id'/></sitem>
<sitem>text-indent : <specref ref='text-indent'/></sitem>
<sitem>end-indent : <specref ref='end-indent'/></sitem>
<sitem>start-indent : <specref ref='start-indent'/></sitem>
<sitem>keep : <specref ref='keep'/></sitem>
<sitem>orphans : <specref ref='orphans'/></sitem>
<sitem>widows : <specref ref='widows'/></sitem>
<sitem>keep-with-next : <specref ref='keep-with-next'/></sitem>
<sitem>keep-with-previous : <specref ref='keep-with-previous'/></sitem>
<sitem>language : <specref ref='language'/></sitem>
<sitem>letter-spacing : <specref ref='letter-spacing'/></sitem>
<sitem>letter-spacing-limit : <specref ref='letter-spacing-limit'/></sitem>
<sitem>line-height : <specref ref='line-height'/></sitem>
<sitem>line-height-option : <specref ref='line-height-option'/></sitem>
<sitem>min-leading : <specref ref='min-leading'/></sitem>
<sitem>min-post-line-spacing : <specref ref='min-post-line-spacing'/></sitem>
<sitem>min-pre-line-spacing : <specref ref='min-pre-line-spacing'/></sitem>
<sitem>line-spacing-precedence : <specref ref='line-spacing-precedence'/></sitem>
<sitem>padding-top : <specref ref='padding-top'/></sitem>
<sitem>padding-bottom : <specref ref='padding-bottom'/></sitem>
<sitem>padding-left : <specref ref='padding-left'/></sitem>
<sitem>padding-right : <specref ref='padding-right'/></sitem>
<sitem>padding-before : <specref ref='padding-before'/></sitem>
<sitem>padding-after : <specref ref='padding-after'/></sitem>
<sitem>padding-start : <specref ref='padding-start'/></sitem>
<sitem>padding-end : <specref ref='padding-end'/></sitem>
<sitem>space-after : <specref ref='space-after'/></sitem>
<sitem>space-before : <specref ref='space-before'/></sitem>
<sitem>text-align : <specref ref='text-align'/></sitem>
<sitem>text-align-last : <specref ref='text-align-last'/></sitem>
<sitem>asis-truncate-indicator : <specref ref='asis-truncate-indicator'/></sitem>
<sitem>asis-wrap-indent : <specref ref='asis-wrap-indent'/></sitem>
<sitem>asis-wrap-indicator : <specref ref='asis-wrap-indicator'/></sitem>
<sitem>expand-tabs : <specref ref='expand-tabs'/></sitem>
<sitem>ignore-record-end : <specref ref='ignore-record-end'/></sitem>
<sitem>wrap-option : <specref ref='wrap-option'/></sitem>
<sitem>writing-mode : <specref ref='writing-mode'/></sitem>
</slist></div4>
</div3>
<div3><head>fo:character</head><div4><head>Purpose</head><p>The character formatting object is used when one needs to explicitly override a specific character or array of characters with a specific glyph.
</p>
</div4><div4><head>Description</head><p>When the result tree is interpreted as a tree of formatting objects, a character in the result tree is treated as if it were an empty element of type fo:character with a char attribute equal to the character.</p>
</div4><div4><head>Properties</head><slist><sitem>background-attachment : <specref ref='background-attachment'/></sitem>
<sitem>background-color : <specref ref='background-color'/></sitem>
<sitem>background-image : <specref ref='background-image'/></sitem>
<sitem>background-position : <specref ref='background-position'/></sitem>
<sitem>background-repeat : <specref ref='background-repeat'/></sitem>
<sitem>border-color-top : <specref ref='border-color-top'/></sitem>
<sitem>border-color-bottom : <specref ref='border-color-bottom'/></sitem>
<sitem>border-color-left : <specref ref='border-color-left'/></sitem>
<sitem>border-color-right : <specref ref='border-color-right'/></sitem>
<sitem>border-color-before : <specref ref='border-color-before'/></sitem>
<sitem>border-color-after : <specref ref='border-color-after'/></sitem>
<sitem>border-color-start : <specref ref='border-color-start'/></sitem>
<sitem>border-color-end : <specref ref='border-color-end'/></sitem>
<sitem>border-width-top : <specref ref='border-width-top'/></sitem>
<sitem>border-width-bottom : <specref ref='border-width-bottom'/></sitem>
<sitem>border-width-left : <specref ref='border-width-left'/></sitem>
<sitem>border-width-right : <specref ref='border-width-right'/></sitem>
<sitem>border-width-before : <specref ref='border-width-before'/></sitem>
<sitem>border-width-after : <specref ref='border-width-after'/></sitem>
<sitem>border-width-start : <specref ref='border-width-start'/></sitem>
<sitem>border-width-end : <specref ref='border-width-end'/></sitem>
<sitem>character : <specref ref='character'/></sitem>
<sitem>color : <specref ref='color'/></sitem>
<sitem>font-family : <specref ref='font-family'/></sitem>
<sitem>system-font : <specref ref='system-font'/></sitem>
<sitem>font-size : <specref ref='font-size'/></sitem>
<sitem>font-size-adjust : <specref ref='font-size-adjust'/></sitem>
<sitem>font-stretch : <specref ref='font-stretch'/></sitem>
<sitem>font-style : <specref ref='font-style'/></sitem>
<sitem>font-variant : <specref ref='font-variant'/></sitem>
<sitem>font-weight : <specref ref='font-weight'/></sitem>
<sitem>glyph-id : <specref ref='glyph-id'/></sitem>
<sitem>hyphenate : <specref ref='hyphenate'/></sitem>
<sitem>hyphenation-char : <specref ref='hyphenation-char'/></sitem>
<sitem>hyphenation-ladder-count : <specref ref='hyphenation-ladder-count'/></sitem>
<sitem>hyphenation-push-char-count : <specref ref='hyphenation-push-char-count'/></sitem>
<sitem>hyphenation-remain-char-count : <specref ref='hyphenation-remain-char-count'/></sitem>
<sitem>id : <specref ref='id'/></sitem>
<sitem>inhibit-line-breaks : <specref ref='inhibit-line-breaks'/></sitem>
<sitem>kern : <specref ref='kern'/></sitem>
<sitem>kern-mode : <specref ref='kern-mode'/></sitem>
<sitem>language : <specref ref='language'/></sitem>
<sitem>letter-spacing : <specref ref='letter-spacing'/></sitem>
<sitem>ligature : <specref ref='ligature'/></sitem>
<sitem>padding-top : <specref ref='padding-top'/></sitem>
<sitem>padding-bottom : <specref ref='padding-bottom'/></sitem>
<sitem>padding-left : <specref ref='padding-left'/></sitem>
<sitem>padding-right : <specref ref='padding-right'/></sitem>
<sitem>padding-before : <specref ref='padding-before'/></sitem>
<sitem>padding-after : <specref ref='padding-after'/></sitem>
<sitem>padding-start : <specref ref='padding-start'/></sitem>
<sitem>padding-end : <specref ref='padding-end'/></sitem>
<sitem>vertical-align : <specref ref='vertical-align'/></sitem>
<sitem>escapement-space-start : <specref ref='escapement-space-start'/></sitem>
<sitem>text-shadow : <specref ref='text-shadow'/></sitem>
<sitem>input-whitespace-treatment : <specref ref='input-whitespace-treatment'/></sitem>
<sitem>word-spacing : <specref ref='word-spacing'/></sitem>
<sitem>word-spacing-limit : <specref ref='word-spacing-limit'/></sitem>
<sitem>writing-mode : <specref ref='writing-mode'/></sitem>
</slist></div4>
</div3>
<div3><head>fo:display-graphic</head><div4><head>Purpose</head><p>Creates a block-level area that contains a graphic.
</p>
</div4><div4><head>Description</head><p>This object creates a block-level area that contains a graphic.  
</p>
</div4><div4><head>Properties</head><slist><sitem>background-attachment : <specref ref='background-attachment'/></sitem>
<sitem>background-color : <specref ref='background-color'/></sitem>
<sitem>background-image : <specref ref='background-image'/></sitem>
<sitem>background-position : <specref ref='background-position'/></sitem>
<sitem>background-repeat : <specref ref='background-repeat'/></sitem>
<sitem>border-color-top : <specref ref='border-color-top'/></sitem>
<sitem>border-color-bottom : <specref ref='border-color-bottom'/></sitem>
<sitem>border-color-left : <specref ref='border-color-left'/></sitem>
<sitem>border-color-right : <specref ref='border-color-right'/></sitem>
<sitem>border-color-before : <specref ref='border-color-before'/></sitem>
<sitem>border-color-after : <specref ref='border-color-after'/></sitem>
<sitem>border-color-start : <specref ref='border-color-start'/></sitem>
<sitem>border-color-end : <specref ref='border-color-end'/></sitem>
<sitem>border-width-top : <specref ref='border-width-top'/></sitem>
<sitem>border-width-bottom : <specref ref='border-width-bottom'/></sitem>
<sitem>border-width-left : <specref ref='border-width-left'/></sitem>
<sitem>border-width-right : <specref ref='border-width-right'/></sitem>
<sitem>border-width-before : <specref ref='border-width-before'/></sitem>
<sitem>border-width-after : <specref ref='border-width-after'/></sitem>
<sitem>border-width-start : <specref ref='border-width-start'/></sitem>
<sitem>border-width-end : <specref ref='border-width-end'/></sitem>
<sitem>break-before : <specref ref='break-before'/></sitem>
<sitem>break-after : <specref ref='break-after'/></sitem>
<sitem>color : <specref ref='color'/></sitem>
<sitem>max-height : <specref ref='max-height'/></sitem>
<sitem>id : <specref ref='id'/></sitem>
<sitem>image : <specref ref='image'/></sitem>
<sitem>end-indent : <specref ref='end-indent'/></sitem>
<sitem>start-indent : <specref ref='start-indent'/></sitem>
<sitem>inhibit-line-breaks : <specref ref='inhibit-line-breaks'/></sitem>
<sitem>keep : <specref ref='keep'/></sitem>
<sitem>keep-with-next : <specref ref='keep-with-next'/></sitem>
<sitem>keep-with-previous : <specref ref='keep-with-previous'/></sitem>
<sitem>padding-top : <specref ref='padding-top'/></sitem>
<sitem>padding-bottom : <specref ref='padding-bottom'/></sitem>
<sitem>padding-left : <specref ref='padding-left'/></sitem>
<sitem>padding-right : <specref ref='padding-right'/></sitem>
<sitem>padding-before : <specref ref='padding-before'/></sitem>
<sitem>padding-after : <specref ref='padding-after'/></sitem>
<sitem>padding-start : <specref ref='padding-start'/></sitem>
<sitem>padding-end : <specref ref='padding-end'/></sitem>
<sitem>position-point : <specref ref='position-point'/></sitem>
<sitem>scale-graphic : <specref ref='scale-graphic'/></sitem>
<sitem>space-after : <specref ref='space-after'/></sitem>
<sitem>space-before : <specref ref='space-before'/></sitem>
<sitem>max-width : <specref ref='max-width'/></sitem>
<sitem>writing-mode : <specref ref='writing-mode'/></sitem>
</slist></div4>
</div3>
<div3><head>fo:display-link</head><div4><head>Purpose</head><p>A link that produces a block-level area.</p>
</div4><div4><head>Description</head><p>This object represents a link that produces a block-level area.  The children of this object will be the "hot spot" for the activation of the link.</p>
</div4><div4><head>Properties</head><slist><sitem>background-attachment : <specref ref='background-attachment'/></sitem>
<sitem>background-color : <specref ref='background-color'/></sitem>
<sitem>background-image : <specref ref='background-image'/></sitem>
<sitem>background-position : <specref ref='background-position'/></sitem>
<sitem>background-repeat : <specref ref='background-repeat'/></sitem>
<sitem>border-color-top : <specref ref='border-color-top'/></sitem>
<sitem>border-color-bottom : <specref ref='border-color-bottom'/></sitem>
<sitem>border-color-left : <specref ref='border-color-left'/></sitem>
<sitem>border-color-right : <specref ref='border-color-right'/></sitem>
<sitem>border-color-before : <specref ref='border-color-before'/></sitem>
<sitem>border-color-after : <specref ref='border-color-after'/></sitem>
<sitem>border-color-start : <specref ref='border-color-start'/></sitem>
<sitem>border-color-end : <specref ref='border-color-end'/></sitem>
<sitem>border-width-top : <specref ref='border-width-top'/></sitem>
<sitem>border-width-bottom : <specref ref='border-width-bottom'/></sitem>
<sitem>border-width-left : <specref ref='border-width-left'/></sitem>
<sitem>border-width-right : <specref ref='border-width-right'/></sitem>
<sitem>border-width-before : <specref ref='border-width-before'/></sitem>
<sitem>border-width-after : <specref ref='border-width-after'/></sitem>
<sitem>border-width-start : <specref ref='border-width-start'/></sitem>
<sitem>border-width-end : <specref ref='border-width-end'/></sitem>
<sitem>destination : <specref ref='destination'/></sitem>
<sitem>padding-top : <specref ref='padding-top'/></sitem>
<sitem>padding-bottom : <specref ref='padding-bottom'/></sitem>
<sitem>padding-left : <specref ref='padding-left'/></sitem>
<sitem>padding-right : <specref ref='padding-right'/></sitem>
<sitem>padding-before : <specref ref='padding-before'/></sitem>
<sitem>padding-after : <specref ref='padding-after'/></sitem>
<sitem>padding-start : <specref ref='padding-start'/></sitem>
<sitem>padding-end : <specref ref='padding-end'/></sitem>
</slist></div4>
</div3>
<div3><head>fo:display-rule</head><div4><head>Purpose</head><p>Produces a block-level rule (line).</p>
</div4><div4><head>Description</head><p>This object represents a block-level rule.  It creates a line according to the properties that produces a block-level area.</p>
</div4><div4><head>Properties</head><slist><sitem>background-attachment : <specref ref='background-attachment'/></sitem>
<sitem>background-color : <specref ref='background-color'/></sitem>
<sitem>background-image : <specref ref='background-image'/></sitem>
<sitem>background-position : <specref ref='background-position'/></sitem>
<sitem>background-repeat : <specref ref='background-repeat'/></sitem>
<sitem>border-color-top : <specref ref='border-color-top'/></sitem>
<sitem>border-color-bottom : <specref ref='border-color-bottom'/></sitem>
<sitem>border-color-left : <specref ref='border-color-left'/></sitem>
<sitem>border-color-right : <specref ref='border-color-right'/></sitem>
<sitem>border-color-before : <specref ref='border-color-before'/></sitem>
<sitem>border-color-after : <specref ref='border-color-after'/></sitem>
<sitem>border-color-start : <specref ref='border-color-start'/></sitem>
<sitem>border-color-end : <specref ref='border-color-end'/></sitem>
<sitem>border-width-top : <specref ref='border-width-top'/></sitem>
<sitem>border-width-bottom : <specref ref='border-width-bottom'/></sitem>
<sitem>border-width-left : <specref ref='border-width-left'/></sitem>
<sitem>border-width-right : <specref ref='border-width-right'/></sitem>
<sitem>border-width-before : <specref ref='border-width-before'/></sitem>
<sitem>border-width-after : <specref ref='border-width-after'/></sitem>
<sitem>border-width-start : <specref ref='border-width-start'/></sitem>
<sitem>border-width-end : <specref ref='border-width-end'/></sitem>
<sitem>break-before : <specref ref='break-before'/></sitem>
<sitem>break-after : <specref ref='break-after'/></sitem>
<sitem>color : <specref ref='color'/></sitem>
<sitem>line-offset : <specref ref='line-offset'/></sitem>
<sitem>line-thickness : <specref ref='line-thickness'/></sitem>
<sitem>id : <specref ref='id'/></sitem>
<sitem>end-indent : <specref ref='end-indent'/></sitem>
<sitem>start-indent : <specref ref='start-indent'/></sitem>
<sitem>inhibit-line-breaks : <specref ref='inhibit-line-breaks'/></sitem>
<sitem>keep : <specref ref='keep'/></sitem>
<sitem>keep-with-next : <specref ref='keep-with-next'/></sitem>
<sitem>keep-with-previous : <specref ref='keep-with-previous'/></sitem>
<sitem>length : <specref ref='length'/></sitem>
<sitem>orientation : <specref ref='orientation'/></sitem>
<sitem>padding-top : <specref ref='padding-top'/></sitem>
<sitem>padding-bottom : <specref ref='padding-bottom'/></sitem>
<sitem>padding-left : <specref ref='padding-left'/></sitem>
<sitem>padding-right : <specref ref='padding-right'/></sitem>
<sitem>padding-before : <specref ref='padding-before'/></sitem>
<sitem>padding-after : <specref ref='padding-after'/></sitem>
<sitem>padding-start : <specref ref='padding-start'/></sitem>
<sitem>padding-end : <specref ref='padding-end'/></sitem>
<sitem>vertical-align : <specref ref='vertical-align'/></sitem>
<sitem>space-after : <specref ref='space-after'/></sitem>
<sitem>space-before : <specref ref='space-before'/></sitem>
<sitem>writing-mode : <specref ref='writing-mode'/></sitem>
</slist></div4>
</div3>
<div3><head>fo:display-sequence</head><div4><head>Purpose</head><p>A display-sequence is used to group block-level flow objects and to assign inherited properties to be shared across them.</p>
</div4><div4><head>Description</head>
<p>A display-sequence formatting object is formatted to produce the series of the block-level areas produced by each of its children. This object must contain only block-level flow objects and holds its content as children.
</p>
<p>A display-sequence has no applicable properties.
</p>
</div4><div4><head>Properties</head><slist><sitem>id : <specref ref='id'/></sitem>
</slist></div4>
</div3>
<div3><head>fo:inline-graphic</head><div4><head>Purpose</head><p>Creates a inline area that contains a graphic.
</p>
</div4><div4><head>Description</head><p>This object creates an inline area that contains a graphic.  
</p>
</div4><div4><head>Properties</head><slist><sitem>background-attachment : <specref ref='background-attachment'/></sitem>
<sitem>background-color : <specref ref='background-color'/></sitem>
<sitem>background-image : <specref ref='background-image'/></sitem>
<sitem>background-position : <specref ref='background-position'/></sitem>
<sitem>background-repeat : <specref ref='background-repeat'/></sitem>
<sitem>border-color-top : <specref ref='border-color-top'/></sitem>
<sitem>border-color-bottom : <specref ref='border-color-bottom'/></sitem>
<sitem>border-color-left : <specref ref='border-color-left'/></sitem>
<sitem>border-color-right : <specref ref='border-color-right'/></sitem>
<sitem>border-color-before : <specref ref='border-color-before'/></sitem>
<sitem>border-color-after : <specref ref='border-color-after'/></sitem>
<sitem>border-color-start : <specref ref='border-color-start'/></sitem>
<sitem>border-color-end : <specref ref='border-color-end'/></sitem>
<sitem>border-width-top : <specref ref='border-width-top'/></sitem>
<sitem>border-width-bottom : <specref ref='border-width-bottom'/></sitem>
<sitem>border-width-left : <specref ref='border-width-left'/></sitem>
<sitem>border-width-right : <specref ref='border-width-right'/></sitem>
<sitem>border-width-before : <specref ref='border-width-before'/></sitem>
<sitem>border-width-after : <specref ref='border-width-after'/></sitem>
<sitem>border-width-start : <specref ref='border-width-start'/></sitem>
<sitem>border-width-end : <specref ref='border-width-end'/></sitem>
<sitem>color : <specref ref='color'/></sitem>
<sitem>max-height : <specref ref='max-height'/></sitem>
<sitem>id : <specref ref='id'/></sitem>
<sitem>image : <specref ref='image'/></sitem>
<sitem>end-indent : <specref ref='end-indent'/></sitem>
<sitem>start-indent : <specref ref='start-indent'/></sitem>
<sitem>inhibit-line-breaks : <specref ref='inhibit-line-breaks'/></sitem>
<sitem>keep : <specref ref='keep'/></sitem>
<sitem>keep-with-next : <specref ref='keep-with-next'/></sitem>
<sitem>keep-with-previous : <specref ref='keep-with-previous'/></sitem>
<sitem>padding-top : <specref ref='padding-top'/></sitem>
<sitem>padding-bottom : <specref ref='padding-bottom'/></sitem>
<sitem>padding-left : <specref ref='padding-left'/></sitem>
<sitem>padding-right : <specref ref='padding-right'/></sitem>
<sitem>padding-before : <specref ref='padding-before'/></sitem>
<sitem>padding-after : <specref ref='padding-after'/></sitem>
<sitem>padding-start : <specref ref='padding-start'/></sitem>
<sitem>padding-end : <specref ref='padding-end'/></sitem>
<sitem>vertical-align : <specref ref='vertical-align'/></sitem>
<sitem>scale-graphic : <specref ref='scale-graphic'/></sitem>
<sitem>space-end : <specref ref='space-end'/></sitem>
<sitem>space-start : <specref ref='space-start'/></sitem>
<sitem>max-width : <specref ref='max-width'/></sitem>
<sitem>writing-mode : <specref ref='writing-mode'/></sitem>
</slist></div4>
</div3>
<div3><head>fo:inline-link</head><div4><head>Purpose</head><p>A link that produces an inline area.</p>
</div4><div4><head>Description</head><p>This object represents a link that produces a inline area.  The children of this object will be the "hot spot" for the activation of the link.</p>
</div4><div4><head>Properties</head><slist><sitem>background-attachment : <specref ref='background-attachment'/></sitem>
<sitem>background-color : <specref ref='background-color'/></sitem>
<sitem>background-image : <specref ref='background-image'/></sitem>
<sitem>background-position : <specref ref='background-position'/></sitem>
<sitem>background-repeat : <specref ref='background-repeat'/></sitem>
<sitem>border-color-top : <specref ref='border-color-top'/></sitem>
<sitem>border-color-bottom : <specref ref='border-color-bottom'/></sitem>
<sitem>border-color-left : <specref ref='border-color-left'/></sitem>
<sitem>border-color-right : <specref ref='border-color-right'/></sitem>
<sitem>border-color-before : <specref ref='border-color-before'/></sitem>
<sitem>border-color-after : <specref ref='border-color-after'/></sitem>
<sitem>border-color-start : <specref ref='border-color-start'/></sitem>
<sitem>border-color-end : <specref ref='border-color-end'/></sitem>
<sitem>border-width-top : <specref ref='border-width-top'/></sitem>
<sitem>border-width-bottom : <specref ref='border-width-bottom'/></sitem>
<sitem>border-width-left : <specref ref='border-width-left'/></sitem>
<sitem>border-width-right : <specref ref='border-width-right'/></sitem>
<sitem>border-width-before : <specref ref='border-width-before'/></sitem>
<sitem>border-width-after : <specref ref='border-width-after'/></sitem>
<sitem>border-width-start : <specref ref='border-width-start'/></sitem>
<sitem>border-width-end : <specref ref='border-width-end'/></sitem>
<sitem>destination : <specref ref='destination'/></sitem>
<sitem>padding-top : <specref ref='padding-top'/></sitem>
<sitem>padding-bottom : <specref ref='padding-bottom'/></sitem>
<sitem>padding-left : <specref ref='padding-left'/></sitem>
<sitem>padding-right : <specref ref='padding-right'/></sitem>
<sitem>padding-before : <specref ref='padding-before'/></sitem>
<sitem>padding-after : <specref ref='padding-after'/></sitem>
<sitem>padding-start : <specref ref='padding-start'/></sitem>
<sitem>padding-end : <specref ref='padding-end'/></sitem>
</slist></div4>
</div3>
<div3><head>fo:inline-rule</head><div4><head>Purpose</head><p>Produces a inline rule (line).</p>
</div4><div4><head>Description</head><p>This object represents a inline rule.  It creates a line according to the properties that produces a inline area.</p>
</div4><div4><head>Properties</head><slist><sitem>background-attachment : <specref ref='background-attachment'/></sitem>
<sitem>background-color : <specref ref='background-color'/></sitem>
<sitem>background-image : <specref ref='background-image'/></sitem>
<sitem>background-position : <specref ref='background-position'/></sitem>
<sitem>background-repeat : <specref ref='background-repeat'/></sitem>
<sitem>border-color-top : <specref ref='border-color-top'/></sitem>
<sitem>border-color-bottom : <specref ref='border-color-bottom'/></sitem>
<sitem>border-color-left : <specref ref='border-color-left'/></sitem>
<sitem>border-color-right : <specref ref='border-color-right'/></sitem>
<sitem>border-color-before : <specref ref='border-color-before'/></sitem>
<sitem>border-color-after : <specref ref='border-color-after'/></sitem>
<sitem>border-color-start : <specref ref='border-color-start'/></sitem>
<sitem>border-color-end : <specref ref='border-color-end'/></sitem>
<sitem>border-width-top : <specref ref='border-width-top'/></sitem>
<sitem>border-width-bottom : <specref ref='border-width-bottom'/></sitem>
<sitem>border-width-left : <specref ref='border-width-left'/></sitem>
<sitem>border-width-right : <specref ref='border-width-right'/></sitem>
<sitem>border-width-before : <specref ref='border-width-before'/></sitem>
<sitem>border-width-after : <specref ref='border-width-after'/></sitem>
<sitem>border-width-start : <specref ref='border-width-start'/></sitem>
<sitem>border-width-end : <specref ref='border-width-end'/></sitem>
<sitem>color : <specref ref='color'/></sitem>
<sitem>line-offset : <specref ref='line-offset'/></sitem>
<sitem>line-thickness : <specref ref='line-thickness'/></sitem>
<sitem>id : <specref ref='id'/></sitem>
<sitem>end-indent : <specref ref='end-indent'/></sitem>
<sitem>start-indent : <specref ref='start-indent'/></sitem>
<sitem>inhibit-line-breaks : <specref ref='inhibit-line-breaks'/></sitem>
<sitem>keep : <specref ref='keep'/></sitem>
<sitem>keep-with-next : <specref ref='keep-with-next'/></sitem>
<sitem>keep-with-previous : <specref ref='keep-with-previous'/></sitem>
<sitem>length : <specref ref='length'/></sitem>
<sitem>orientation : <specref ref='orientation'/></sitem>
<sitem>padding-top : <specref ref='padding-top'/></sitem>
<sitem>padding-bottom : <specref ref='padding-bottom'/></sitem>
<sitem>padding-left : <specref ref='padding-left'/></sitem>
<sitem>padding-right : <specref ref='padding-right'/></sitem>
<sitem>padding-before : <specref ref='padding-before'/></sitem>
<sitem>padding-after : <specref ref='padding-after'/></sitem>
<sitem>padding-start : <specref ref='padding-start'/></sitem>
<sitem>padding-end : <specref ref='padding-end'/></sitem>
<sitem>vertical-align : <specref ref='vertical-align'/></sitem>
<sitem>space-end : <specref ref='space-end'/></sitem>
<sitem>space-start : <specref ref='space-start'/></sitem>
<sitem>writing-mode : <specref ref='writing-mode'/></sitem>
</slist></div4>
</div3>
<div3><head>fo:inline-sequence</head><div4><head>Purpose</head><p>An inline-sequence is used to group inline flow objects and to assign inherited properties to be shared across them. </p>
</div4><div4><head>Description</head>
<p>An inline-sequence formatting object is formatted to produce the series of inline areas produced by each of its children. This object must contain only inline flow objects and holds its content as children.
</p>
<note><p>An inline-sequence is useful for specifying inherited properties. For example, a sequence with a specification of a font-style property may be constructed for an italic-emphasis phrase element in a block.</p></note>
<p>An inline-sequence has no applicable properties.</p>

</div4><div4><head>Properties</head><slist><sitem>id : <specref ref='id'/></sitem>
</slist></div4>
</div3>
<div3><head>fo:link-end-locator</head><div4><head>Purpose</head><p>Represents a target for link.</p>
</div4><div4><head>Description</head>
</div4><div4><head>Properties</head><slist><sitem>href : <specref ref='href'/></sitem>
<sitem>id : <specref ref='id'/></sitem>
<sitem>show-content : <specref ref='show-content'/></sitem>
</slist></div4>
</div3>
<div3><head>fo:list-block</head><div4><head>Purpose</head><p>Creates a block-level area containing a list.</p>
</div4><div4><head>Description</head><p>The object creates a block-level area containing a list.  Its allowed children are
either only list-item-label,list-item pairs or only list-item-body objects.</p>
</div4><div4><head>Properties</head><slist><sitem>background-attachment : <specref ref='background-attachment'/></sitem>
<sitem>background-color : <specref ref='background-color'/></sitem>
<sitem>background-image : <specref ref='background-image'/></sitem>
<sitem>background-position : <specref ref='background-position'/></sitem>
<sitem>background-repeat : <specref ref='background-repeat'/></sitem>
<sitem>border-color-top : <specref ref='border-color-top'/></sitem>
<sitem>border-color-bottom : <specref ref='border-color-bottom'/></sitem>
<sitem>border-color-left : <specref ref='border-color-left'/></sitem>
<sitem>border-color-right : <specref ref='border-color-right'/></sitem>
<sitem>border-color-before : <specref ref='border-color-before'/></sitem>
<sitem>border-color-after : <specref ref='border-color-after'/></sitem>
<sitem>border-color-start : <specref ref='border-color-start'/></sitem>
<sitem>border-color-end : <specref ref='border-color-end'/></sitem>
<sitem>border-width-top : <specref ref='border-width-top'/></sitem>
<sitem>border-width-bottom : <specref ref='border-width-bottom'/></sitem>
<sitem>border-width-left : <specref ref='border-width-left'/></sitem>
<sitem>border-width-right : <specref ref='border-width-right'/></sitem>
<sitem>border-width-before : <specref ref='border-width-before'/></sitem>
<sitem>border-width-after : <specref ref='border-width-after'/></sitem>
<sitem>border-width-start : <specref ref='border-width-start'/></sitem>
<sitem>border-width-end : <specref ref='border-width-end'/></sitem>
<sitem>break-before : <specref ref='break-before'/></sitem>
<sitem>break-after : <specref ref='break-after'/></sitem>
<sitem>id : <specref ref='id'/></sitem>
<sitem>end-indent : <specref ref='end-indent'/></sitem>
<sitem>start-indent : <specref ref='start-indent'/></sitem>
<sitem>keep : <specref ref='keep'/></sitem>
<sitem>keep-with-next : <specref ref='keep-with-next'/></sitem>
<sitem>keep-with-previous : <specref ref='keep-with-previous'/></sitem>
<sitem>provisional-label-separation : <specref ref='provisional-label-separation'/></sitem>
<sitem>provisional-distance-between-starts : <specref ref='provisional-distance-between-starts'/></sitem>
<sitem>space-between-list-rows : <specref ref='space-between-list-rows'/></sitem>
<sitem>padding-top : <specref ref='padding-top'/></sitem>
<sitem>padding-bottom : <specref ref='padding-bottom'/></sitem>
<sitem>padding-left : <specref ref='padding-left'/></sitem>
<sitem>padding-right : <specref ref='padding-right'/></sitem>
<sitem>padding-before : <specref ref='padding-before'/></sitem>
<sitem>padding-after : <specref ref='padding-after'/></sitem>
<sitem>padding-start : <specref ref='padding-start'/></sitem>
<sitem>padding-end : <specref ref='padding-end'/></sitem>
<sitem>space-after : <specref ref='space-after'/></sitem>
<sitem>space-before : <specref ref='space-before'/></sitem>
</slist></div4>
</div3>
<div3><head>fo:list-item</head><div4><head>Purpose</head><p>A list-item flow object contains the label and the body of each item; it may be used for overriding and modifying some of the list's properties on a case by case basis.</p>
</div4><div4><head>Description</head>
<p>A list-item flow object can only be contained by a list. It is a wrapper for a list-item-label and an list-item-body. It controls their position relative to other items within the list. Most of its properties are typically specified on the list. It controls the position and padding of the label and the body within the list-item and in relation to other list-items in the list.</p>

</div4><div4><head>Properties</head><slist><sitem>background-attachment : <specref ref='background-attachment'/></sitem>
<sitem>background-color : <specref ref='background-color'/></sitem>
<sitem>background-image : <specref ref='background-image'/></sitem>
<sitem>background-position : <specref ref='background-position'/></sitem>
<sitem>background-repeat : <specref ref='background-repeat'/></sitem>
<sitem>border-color-top : <specref ref='border-color-top'/></sitem>
<sitem>border-color-bottom : <specref ref='border-color-bottom'/></sitem>
<sitem>border-color-left : <specref ref='border-color-left'/></sitem>
<sitem>border-color-right : <specref ref='border-color-right'/></sitem>
<sitem>border-color-before : <specref ref='border-color-before'/></sitem>
<sitem>border-color-after : <specref ref='border-color-after'/></sitem>
<sitem>border-color-start : <specref ref='border-color-start'/></sitem>
<sitem>border-color-end : <specref ref='border-color-end'/></sitem>
<sitem>border-width-top : <specref ref='border-width-top'/></sitem>
<sitem>border-width-bottom : <specref ref='border-width-bottom'/></sitem>
<sitem>border-width-left : <specref ref='border-width-left'/></sitem>
<sitem>border-width-right : <specref ref='border-width-right'/></sitem>
<sitem>border-width-before : <specref ref='border-width-before'/></sitem>
<sitem>border-width-after : <specref ref='border-width-after'/></sitem>
<sitem>border-width-start : <specref ref='border-width-start'/></sitem>
<sitem>border-width-end : <specref ref='border-width-end'/></sitem>
<sitem>id : <specref ref='id'/></sitem>
<sitem>padding-top : <specref ref='padding-top'/></sitem>
<sitem>padding-bottom : <specref ref='padding-bottom'/></sitem>
<sitem>padding-left : <specref ref='padding-left'/></sitem>
<sitem>padding-right : <specref ref='padding-right'/></sitem>
<sitem>padding-before : <specref ref='padding-before'/></sitem>
<sitem>padding-after : <specref ref='padding-after'/></sitem>
<sitem>padding-start : <specref ref='padding-start'/></sitem>
<sitem>padding-end : <specref ref='padding-end'/></sitem>
<sitem>space-end : <specref ref='space-end'/></sitem>
<sitem>space-start : <specref ref='space-start'/></sitem>
<sitem>space-after : <specref ref='space-after'/></sitem>
<sitem>space-before : <specref ref='space-before'/></sitem>
</slist></div4>
</div3>
<div3><head>fo:list-item-body</head><div4><head>Purpose</head><p>The item-body flow object holds the components (usually blocks) for a list item.
It controls styling defaults for the body, the spacing between lines and between paras within the list item, break precedences for line and paragraphs within the list item.
</p>
</div4><div4><head>Description</head><p>The item's body contains the content of the item, generally in the form of blocks.</p>
</div4><div4><head>Properties</head><slist><sitem>background-attachment : <specref ref='background-attachment'/></sitem>
<sitem>background-color : <specref ref='background-color'/></sitem>
<sitem>background-image : <specref ref='background-image'/></sitem>
<sitem>background-position : <specref ref='background-position'/></sitem>
<sitem>background-repeat : <specref ref='background-repeat'/></sitem>
<sitem>border-color-top : <specref ref='border-color-top'/></sitem>
<sitem>border-color-bottom : <specref ref='border-color-bottom'/></sitem>
<sitem>border-color-left : <specref ref='border-color-left'/></sitem>
<sitem>border-color-right : <specref ref='border-color-right'/></sitem>
<sitem>border-color-before : <specref ref='border-color-before'/></sitem>
<sitem>border-color-after : <specref ref='border-color-after'/></sitem>
<sitem>border-color-start : <specref ref='border-color-start'/></sitem>
<sitem>border-color-end : <specref ref='border-color-end'/></sitem>
<sitem>border-width-top : <specref ref='border-width-top'/></sitem>
<sitem>border-width-bottom : <specref ref='border-width-bottom'/></sitem>
<sitem>border-width-left : <specref ref='border-width-left'/></sitem>
<sitem>border-width-right : <specref ref='border-width-right'/></sitem>
<sitem>border-width-before : <specref ref='border-width-before'/></sitem>
<sitem>border-width-after : <specref ref='border-width-after'/></sitem>
<sitem>border-width-start : <specref ref='border-width-start'/></sitem>
<sitem>border-width-end : <specref ref='border-width-end'/></sitem>
<sitem>font-family : <specref ref='font-family'/></sitem>
<sitem>system-font : <specref ref='system-font'/></sitem>
<sitem>font-size : <specref ref='font-size'/></sitem>
<sitem>font-size-adjust : <specref ref='font-size-adjust'/></sitem>
<sitem>font-stretch : <specref ref='font-stretch'/></sitem>
<sitem>font-style : <specref ref='font-style'/></sitem>
<sitem>font-variant : <specref ref='font-variant'/></sitem>
<sitem>font-weight : <specref ref='font-weight'/></sitem>
<sitem>glyph-alignment-mode : <specref ref='glyph-alignment-mode'/></sitem>
<sitem>hyphenation-keep : <specref ref='hyphenation-keep'/></sitem>
<sitem>id : <specref ref='id'/></sitem>
<sitem>text-indent : <specref ref='text-indent'/></sitem>
<sitem>end-indent : <specref ref='end-indent'/></sitem>
<sitem>start-indent : <specref ref='start-indent'/></sitem>
<sitem>keep : <specref ref='keep'/></sitem>
<sitem>orphans : <specref ref='orphans'/></sitem>
<sitem>widows : <specref ref='widows'/></sitem>
<sitem>keep-with-next : <specref ref='keep-with-next'/></sitem>
<sitem>keep-with-previous : <specref ref='keep-with-previous'/></sitem>
<sitem>language : <specref ref='language'/></sitem>
<sitem>line-height : <specref ref='line-height'/></sitem>
<sitem>line-height-option : <specref ref='line-height-option'/></sitem>
<sitem>min-leading : <specref ref='min-leading'/></sitem>
<sitem>min-post-line-spacing : <specref ref='min-post-line-spacing'/></sitem>
<sitem>min-pre-line-spacing : <specref ref='min-pre-line-spacing'/></sitem>
<sitem>line-spacing-precedence : <specref ref='line-spacing-precedence'/></sitem>
<sitem>padding-top : <specref ref='padding-top'/></sitem>
<sitem>padding-bottom : <specref ref='padding-bottom'/></sitem>
<sitem>padding-left : <specref ref='padding-left'/></sitem>
<sitem>padding-right : <specref ref='padding-right'/></sitem>
<sitem>padding-before : <specref ref='padding-before'/></sitem>
<sitem>padding-after : <specref ref='padding-after'/></sitem>
<sitem>padding-start : <specref ref='padding-start'/></sitem>
<sitem>padding-end : <specref ref='padding-end'/></sitem>
<sitem>text-align : <specref ref='text-align'/></sitem>
<sitem>text-align-last : <specref ref='text-align-last'/></sitem>
<sitem>text-shadow : <specref ref='text-shadow'/></sitem>
<sitem>asis-truncate-indicator : <specref ref='asis-truncate-indicator'/></sitem>
<sitem>asis-wrap-indent : <specref ref='asis-wrap-indent'/></sitem>
<sitem>asis-wrap-indicator : <specref ref='asis-wrap-indicator'/></sitem>
<sitem>expand-tabs : <specref ref='expand-tabs'/></sitem>
<sitem>ignore-record-end : <specref ref='ignore-record-end'/></sitem>
<sitem>wrap-option : <specref ref='wrap-option'/></sitem>
<sitem>writing-mode : <specref ref='writing-mode'/></sitem>
</slist></div4>
</div3>
<div3><head>fo:list-item-label</head><div4><head>Purpose</head><p>A list-item-label is used to either enumerate, identify or adorn the list-item's body.</p>
</div4><div4><head>Description</head><p>A list-item-label can be contained only in a list-item. It can be used for enumerating the list-item. It can control the positioning of the label and its placement with respect tot he list-item-body. The label has content, and is formatted to become the adornment or enumeration of the list-item.</p>
</div4><div4><head>Properties</head><slist><sitem>background-attachment : <specref ref='background-attachment'/></sitem>
<sitem>background-color : <specref ref='background-color'/></sitem>
<sitem>background-image : <specref ref='background-image'/></sitem>
<sitem>background-position : <specref ref='background-position'/></sitem>
<sitem>background-repeat : <specref ref='background-repeat'/></sitem>
<sitem>border-color-top : <specref ref='border-color-top'/></sitem>
<sitem>border-color-bottom : <specref ref='border-color-bottom'/></sitem>
<sitem>border-color-left : <specref ref='border-color-left'/></sitem>
<sitem>border-color-right : <specref ref='border-color-right'/></sitem>
<sitem>border-color-before : <specref ref='border-color-before'/></sitem>
<sitem>border-color-after : <specref ref='border-color-after'/></sitem>
<sitem>border-color-start : <specref ref='border-color-start'/></sitem>
<sitem>border-color-end : <specref ref='border-color-end'/></sitem>
<sitem>border-width-top : <specref ref='border-width-top'/></sitem>
<sitem>border-width-bottom : <specref ref='border-width-bottom'/></sitem>
<sitem>border-width-left : <specref ref='border-width-left'/></sitem>
<sitem>border-width-right : <specref ref='border-width-right'/></sitem>
<sitem>border-width-before : <specref ref='border-width-before'/></sitem>
<sitem>border-width-after : <specref ref='border-width-after'/></sitem>
<sitem>border-width-start : <specref ref='border-width-start'/></sitem>
<sitem>border-width-end : <specref ref='border-width-end'/></sitem>
<sitem>font-family : <specref ref='font-family'/></sitem>
<sitem>system-font : <specref ref='system-font'/></sitem>
<sitem>font-size : <specref ref='font-size'/></sitem>
<sitem>font-size-adjust : <specref ref='font-size-adjust'/></sitem>
<sitem>font-stretch : <specref ref='font-stretch'/></sitem>
<sitem>font-style : <specref ref='font-style'/></sitem>
<sitem>font-variant : <specref ref='font-variant'/></sitem>
<sitem>font-weight : <specref ref='font-weight'/></sitem>
<sitem>glyph-alignment-mode : <specref ref='glyph-alignment-mode'/></sitem>
<sitem>hyphenation-keep : <specref ref='hyphenation-keep'/></sitem>
<sitem>id : <specref ref='id'/></sitem>
<sitem>text-indent : <specref ref='text-indent'/></sitem>
<sitem>end-indent : <specref ref='end-indent'/></sitem>
<sitem>start-indent : <specref ref='start-indent'/></sitem>
<sitem>keep : <specref ref='keep'/></sitem>
<sitem>orphans : <specref ref='orphans'/></sitem>
<sitem>widows : <specref ref='widows'/></sitem>
<sitem>keep-with-next : <specref ref='keep-with-next'/></sitem>
<sitem>keep-with-previous : <specref ref='keep-with-previous'/></sitem>
<sitem>language : <specref ref='language'/></sitem>
<sitem>line-height : <specref ref='line-height'/></sitem>
<sitem>line-height-option : <specref ref='line-height-option'/></sitem>
<sitem>min-leading : <specref ref='min-leading'/></sitem>
<sitem>min-post-line-spacing : <specref ref='min-post-line-spacing'/></sitem>
<sitem>min-pre-line-spacing : <specref ref='min-pre-line-spacing'/></sitem>
<sitem>line-spacing-precedence : <specref ref='line-spacing-precedence'/></sitem>
<sitem>padding-top : <specref ref='padding-top'/></sitem>
<sitem>padding-bottom : <specref ref='padding-bottom'/></sitem>
<sitem>padding-left : <specref ref='padding-left'/></sitem>
<sitem>padding-right : <specref ref='padding-right'/></sitem>
<sitem>padding-before : <specref ref='padding-before'/></sitem>
<sitem>padding-after : <specref ref='padding-after'/></sitem>
<sitem>padding-start : <specref ref='padding-start'/></sitem>
<sitem>padding-end : <specref ref='padding-end'/></sitem>
<sitem>text-align : <specref ref='text-align'/></sitem>
<sitem>text-align-last : <specref ref='text-align-last'/></sitem>
<sitem>text-shadow : <specref ref='text-shadow'/></sitem>
<sitem>asis-truncate-indicator : <specref ref='asis-truncate-indicator'/></sitem>
<sitem>asis-wrap-indent : <specref ref='asis-wrap-indent'/></sitem>
<sitem>asis-wrap-indicator : <specref ref='asis-wrap-indicator'/></sitem>
<sitem>expand-tabs : <specref ref='expand-tabs'/></sitem>
<sitem>ignore-record-end : <specref ref='ignore-record-end'/></sitem>
<sitem>wrap-option : <specref ref='wrap-option'/></sitem>
<sitem>writing-mode : <specref ref='writing-mode'/></sitem>
</slist></div4>
</div3>
<div3><head>fo:page-number</head><div4><head>Purpose</head><p>This object is used to instruct the formatter to construct and present a page-number. </p>
</div4><div4><head>Description</head><p>This object generates a inline area containing a page number the formatting will generated based on the pagination algorithms it implements.</p>
</div4><div4><head>Properties</head><slist><sitem>id : <specref ref='id'/></sitem>
</slist></div4>
</div3>
<div3><head>fo:queue</head><div4><head>Purpose</head><p>A queue is used to gather content flow objects to be assigned to (placed into) a given area or set of chained-areas.
</p>
</div4><div4><head>Description</head><p>A queue shall not be allowed within the content of any formatting object except a page-sequence.  The queue holds a sequence or tree of formatting-objects that is to be presented in a like-named area of the layout defined by the simple-page-master.
</p>
</div4><div4><head>Properties</head><slist><sitem>id : <specref ref='id'/></sitem>
<sitem>queue-name : <specref ref='queue-name'/></sitem>
</slist></div4>
</div3>
<div3><head>fo:simple-page-master</head><div4><head>Purpose</head><p>A simple-page-master formatting object defines the layout of a page area. Masters may be repeated in accordance with the page-sequence specification.</p>
</div4><div4><head>Description</head>
<p>A simple-page-master is formatted to produce a sequence of page areas.</p>
<note><p>The simple-page-master is intended for systems that wish to provide a very simple page layout facility. Future versions of this specification will support more complex page layouts constructed using the page-master and column-set formatting objects.</p></note>
<p>A simple-page-master shall be allowed only within the page-sequence.</p>
<p>The simple-page-master supports only the sequential-tiled-page-model, with an ordered set of up to 5 of the following areas: header, body, footer, end-side, and start-side. The user may specify the size (height or width) of the header, footer, end-side, and start-side areas and the separation distances between the adjacent areas. The height of the body area is the page's size (page-height for horizontal writing-modes, and page-width for vertical writing-modes) minus the sum of the header and footer heights, the separations between the areas, and the page's margin in the block-progression-direction.</p>

<p>The stacking direction of the areas, the page and area heights and separation distances are in the direction specified by the writing-mode's block-progression-direction.</p>

<p>The width of each area is the full available distance in the inline-progression-direction after subtracting the page's margin (and may not be negative).</p>

<p>A simple-page-master may use up to 6 associated queues. These queues are not direct children of the page-sequence (but are associated with it by name or via an explicit mapping table):</p>

<glist>

<gitem><label>title</label>
<def><p>For online presentations only, this object holds a single title textline to be presented in the window title bar when this simple-page-master is being viewed.</p>
<p>If provided for print environments, this object is ignored.</p>
<p>If there is too much text for the title area, the browser may truncate the presentation.</p>
<p>The content of a title is repeated on each page by replaying the title queue after the body area is processed. (This allows for proper presentation of "dictionary"-style running headers/footers.)</p>
</def>
</gitem>

<gitem><label>header</label>
<def>
<p>Holds the content to be placed in the header area(s).</p>
<p>For print and online environments, this object holds a set of information that is presented in a separate area at the top of the page or window.</p>
<p>If there is too much text for the header area, the presentation may be truncated/clipped.</p>
<p>The content of a header is repeated on each page by replaying the header queue after the body area is processed. (This allows for proper presentation of "dictionary"-style running headers/footers.)</p>
</def>
</gitem>

<gitem><label>footer</label>
<def>
<p>Holds the content to be placed in the footer area(s).</p>
<p>For print and online environments, this holds a set of information that is presented in a separate area at the bottom of the page or window.</p>
<p>If there is too much text for the footer area, the presentation may be truncated/clipped.</p>
<p>The content of a footer is repeated on each page by replaying the footer queue after the body area is processed. (This allows for proper presentation of "dictionary"-style running headers/footers.)</p>
</def>
</gitem>

<gitem><label>start-side</label>
<def>
<p>Holds the content to be placed in the start-side area(s).</p>
<p>For print and online environments, this object holds a set of information that is presented in a separate area at the starting edge (as specified by the page-writing-mode property) of the page or window.</p>
<p>If there is too much text for the start-side area, the presentation may be truncated/clipped.</p>
<p>The content of a start-side area is repeated on each page by replaying the start-side queue after the body area is processed. (This allows for proper presentation of "dictionary"-style running headers/footers.)</p>
</def>
</gitem>

<gitem><label>end-side</label>
<def>
<p>Holds the content to be placed in the end-side area(s).</p>
<p>For print and online environments, this holds a set of information that is presented in a separate area at the ending edge of the page or window.</p>
<p>If there is too much text for the end-side area, the presentation may be truncated/clipped.</p>
<p>The content of a end-side area is repeated on each page by replaying the end-side queue after the body area is processed. (This allows for proper presentation of "dictionary"-style running headers/footers.)</p>
</def>
</gitem>

<gitem><label>body</label>
<def>
<p>Holds the content to be placed in the body area(s).</p>
<p>For print and online environments, this holds the information that is presented in the main area in the middle of the page or window.</p>
<p>In a print environment, if there is too much text for the body area the formatter should create additional pages until all the content is presented.</p>
<p>In a online environment, if there is too much text for the body area the formatter can create additional pages/frames/panels until all the content is presented or it can present the content in a scrolling view.</p>
</def>
</gitem>
</glist>

<p>The simple-page-master defines 5 areas for presentation within the page/window design (formatted area of the page). These are the header, body, footer, start-side, and end-side. It also provides a title, which has no properties defined in the simple-page-master object, but may for example be presented in a browser's title bar.</p>
<p>The following simple-page-masters are the only ones supported in this draft of the standard:</p>
<glist>
<gitem><label>first</label>
<def><p>The master to be used for the first page in the sequence.</p></def>
</gitem>
<gitem><label>odd</label>
<def><p>The master to be used for odd-phased pages after the first page in the sequence.</p></def>
</gitem>
<gitem><label>even</label>
<def><p>The master to be used for even-phased pages after the first page in the sequence.</p></def>
</gitem>
<gitem><label>scrolling</label>
<def><p>The master to be used for scrolling (non-paged) online presentation.</p></def>
</gitem>
</glist>


</div4><div4><head>Properties</head><slist><sitem>background-attachment : <specref ref='background-attachment'/></sitem>
<sitem>background-color : <specref ref='background-color'/></sitem>
<sitem>background-image : <specref ref='background-image'/></sitem>
<sitem>background-position : <specref ref='background-position'/></sitem>
<sitem>background-repeat : <specref ref='background-repeat'/></sitem>
<sitem>border-color-top : <specref ref='border-color-top'/></sitem>
<sitem>border-color-bottom : <specref ref='border-color-bottom'/></sitem>
<sitem>border-color-left : <specref ref='border-color-left'/></sitem>
<sitem>border-color-right : <specref ref='border-color-right'/></sitem>
<sitem>border-color-before : <specref ref='border-color-before'/></sitem>
<sitem>border-color-after : <specref ref='border-color-after'/></sitem>
<sitem>border-color-start : <specref ref='border-color-start'/></sitem>
<sitem>border-color-end : <specref ref='border-color-end'/></sitem>
<sitem>border-width-top : <specref ref='border-width-top'/></sitem>
<sitem>border-width-bottom : <specref ref='border-width-bottom'/></sitem>
<sitem>border-width-left : <specref ref='border-width-left'/></sitem>
<sitem>border-width-right : <specref ref='border-width-right'/></sitem>
<sitem>border-width-before : <specref ref='border-width-before'/></sitem>
<sitem>border-width-after : <specref ref='border-width-after'/></sitem>
<sitem>border-width-start : <specref ref='border-width-start'/></sitem>
<sitem>border-width-end : <specref ref='border-width-end'/></sitem>
<sitem>page-height : <specref ref='page-height'/></sitem>
<sitem>page-width : <specref ref='page-width'/></sitem>
<sitem>id : <specref ref='id'/></sitem>
<sitem>page-margin-left : <specref ref='page-margin-left'/></sitem>
<sitem>page-margin-right : <specref ref='page-margin-right'/></sitem>
<sitem>page-margin-bottom : <specref ref='page-margin-bottom'/></sitem>
<sitem>page-margin-top : <specref ref='page-margin-top'/></sitem>
<sitem>padding-top : <specref ref='padding-top'/></sitem>
<sitem>padding-bottom : <specref ref='padding-bottom'/></sitem>
<sitem>padding-left : <specref ref='padding-left'/></sitem>
<sitem>padding-right : <specref ref='padding-right'/></sitem>
<sitem>padding-before : <specref ref='padding-before'/></sitem>
<sitem>padding-after : <specref ref='padding-after'/></sitem>
<sitem>padding-start : <specref ref='padding-start'/></sitem>
<sitem>padding-end : <specref ref='padding-end'/></sitem>
<sitem>footer-separation : <specref ref='footer-separation'/></sitem>
<sitem>header-separation : <specref ref='header-separation'/></sitem>
<sitem>end-side-separation : <specref ref='end-side-separation'/></sitem>
<sitem>start-side-separation : <specref ref='start-side-separation'/></sitem>
<sitem>body-overflow : <specref ref='body-overflow'/></sitem>
<sitem>footer-overflow : <specref ref='footer-overflow'/></sitem>
<sitem>header-overflow : <specref ref='header-overflow'/></sitem>
<sitem>end-side-overflow : <specref ref='end-side-overflow'/></sitem>
<sitem>start-side-overflow : <specref ref='start-side-overflow'/></sitem>
<sitem>footer-size : <specref ref='footer-size'/></sitem>
<sitem>header-size : <specref ref='header-size'/></sitem>
<sitem>end-side-size : <specref ref='end-side-size'/></sitem>
<sitem>start-side-size : <specref ref='start-side-size'/></sitem>
<sitem>page-master-name : <specref ref='page-master-name'/></sitem>
<sitem>page-width : <specref ref='page-width'/></sitem>
<sitem>body-writing-mode : <specref ref='body-writing-mode'/></sitem>
<sitem>end-side-writing-mode : <specref ref='end-side-writing-mode'/></sitem>
<sitem>start-side-writing-mode : <specref ref='start-side-writing-mode'/></sitem>
<sitem>footer-writing-mode : <specref ref='footer-writing-mode'/></sitem>
<sitem>header-writing-mode : <specref ref='header-writing-mode'/></sitem>
<sitem>page-writing-mode : <specref ref='page-writing-mode'/></sitem>
</slist></div4>
</div3>
</div2><div2><head>Formatting Properties</head><div3 id='asis-truncate-indicator'><head>asis-truncate-indicator</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>none : </p>
</item>
</ulist>
<p>A character (See <specref ref='datatypes.char'/>).</p>
</div4><div4><head>Purpose</head><p>Specifies the character (or lack of) to be inserted when truncating content.</p></div4><div4><head>Description</head><p>This property controls what character is inserted with asis content is truncated.  If the property value is 'none', no character will be inserted.</p></div4></div3><div3 id='asis-wrap-indent'><head>asis-wrap-indent</head><div4><head>Allowed Values</head><p>A signed length (See <specref ref='datatypes.signed.length'/>).</p></div4><div4><head>Purpose</head><p>Specifies the indentation when asis content is wrapped.</p></div4></div3><div3 id='asis-wrap-indicator'><head>asis-wrap-indicator</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>none : </p>
</item>
</ulist>
<p>A character (See <specref ref='datatypes.char'/>).</p>
</div4><div4><head>Purpose</head><p>Specifies the character to be used to indicate when asis content is wrapped.</p></div4></div3><div3 id='background-attachment'><head>background-attachment</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>fixed : </p>
   
</item>
<item><p>scroll : (Default)</p>
   
</item>
</ulist>
</div4><div4><head>Purpose</head><p>Specifies if the background image (see 'background-image') should be fixed to the viewport or scroll with the document. </p></div4></div3><div3 id='background-color'><head>background-color</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>transparent : (Default)</p>
   
</item>
</ulist>
<p>A color (See <specref ref='datatypes.color'/>).</p>
</div4><div4><head>Purpose</head><p>Describes the background color of a formatting object.</p></div4></div3><div3 id='background-image'><head>background-image</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>none : (Default)</p>
   
</item>
</ulist>
<p>A URI (See <specref ref='datatypes.uri'/>).</p>
</div4><div4><head>Purpose</head><p>Specifies an image that should be presented in the background.</p></div4></div3><div3 id='background-position'><head>background-position</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>center : </p>
   
</item>
<item><p>left : </p>
   
</item>
<item><p>right : </p>
   
</item>
<item><p>bottom : </p>
   
</item>
<item><p>middle : </p>
   
</item>
<item><p>top : </p>
   
</item>
</ulist>
<p>A an x-y coordinate (See <specref ref='datatypes.coordinate'/>).</p>
</div4><div4><head>Purpose</head><p>Specifies the background image of a formatting object.</p></div4></div3><div3 id='background-repeat'><head>background-repeat</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>no-repeat : </p>
   
</item>
<item><p>repeat : (Default)</p>
   
</item>
<item><p>repeat-x : </p>
   
</item>
<item><p>repeat-y : </p>
   
</item>
</ulist>
</div4><div4><head>Purpose</head><p>Specifies if and how a background image (see 'background-image') should be tiled.</p></div4></div3><div3 id='body-overflow'><head>body-overflow</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>auto : </p>
</item>
<item><p>hidden : </p>
</item>
<item><p>scroll : </p>
</item>
<item><p>visible : </p>
</item>
</ulist>
</div4><div4><head>Purpose</head><p>Specifies the overflow behavior for the body area.  (See overflow).</p></div4><div4><head>Description</head><p>Defines behavior when content is larger than region. (See also XSL:flow-type)</p></div4></div3><div3 id='body-writing-mode'><head>body-writing-mode</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>bt-lr : </p>
</item>
<item><p>bt-rl : </p>
</item>
<item><p>lr-alternating-rl-bt : </p>
</item>
<item><p>lr-alternating-rl-tb : </p>
</item>
<item><p>lr-bt : </p>
</item>
<item><p>lr-inverting-rl-bt : </p>
</item>
<item><p>lr-inverting-rl-tb : </p>
</item>
<item><p>lr-tb : </p>
</item>
<item><p>rl-bt : </p>
</item>
<item><p>rl-tb : </p>
</item>
<item><p>tb-lr : </p>
</item>
<item><p>tb-rl : </p>
</item>
<item><p>tb-rl-in-rl-pairs : </p>
</item>
<item><p>use-page-writing-mode : </p>
</item>
</ulist>
</div4><div4><head>Purpose</head><p>Specifies the writing mode within the body of a simple-page-master.
</p></div4><div4><head>Description</head><p>See the writing-mode property.</p></div4></div3><div3 id='border-color-after'><head>border-color-after</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>transparent : </p>
</item>
</ulist>
<p>A color (See <specref ref='datatypes.color'/>).</p>
</div4><div4><head>Purpose</head><p>Specifies the color of the after border.</p></div4></div3><div3 id='border-color-before'><head>border-color-before</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>transparent : </p>
</item>
</ulist>
<p>A color (See <specref ref='datatypes.color'/>).</p><p>Defaults to black from the transparent color space.</p>
</div4><div4><head>Purpose</head><p>Specifies the color of the before border.</p></div4></div3><div3 id='border-color-bottom'><head>border-color-bottom</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>transparent : </p>
</item>
</ulist>
<p>A color (See <specref ref='datatypes.color'/>).</p><p>Defaults to black from the transparent color space.</p>
</div4><div4><head>Purpose</head><p>Specifies the color of the bottom border.</p></div4></div3><div3 id='border-color-end'><head>border-color-end</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>transparent : </p>
</item>
</ulist>
<p>A color (See <specref ref='datatypes.color'/>).</p><p>Defaults to black from the transparent color space.</p>
</div4><div4><head>Purpose</head><p>Specifies the color of the end border.</p></div4></div3><div3 id='border-color-left'><head>border-color-left</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>transparent : </p>
</item>
</ulist>
<p>A color (See <specref ref='datatypes.color'/>).</p><p>Defaults to black from the transparent color space.</p>
</div4><div4><head>Purpose</head><p>Specifies the color of the left border.</p></div4></div3><div3 id='border-color-right'><head>border-color-right</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>transparent : </p>
</item>
</ulist>
<p>A color (See <specref ref='datatypes.color'/>).</p><p>Defaults to black from the transparent color space.</p>
</div4><div4><head>Purpose</head><p>Specifies the color of the right border.</p></div4></div3><div3 id='border-color-start'><head>border-color-start</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>transparent : </p>
</item>
</ulist>
<p>A color (See <specref ref='datatypes.color'/>).</p><p>Defaults to black from the transparent color space.</p>
</div4><div4><head>Purpose</head><p>Specifies the color of the start border.</p></div4></div3><div3 id='border-color-top'><head>border-color-top</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>transparent : </p>
</item>
</ulist>
<p>A color (See <specref ref='datatypes.color'/>).</p><p>Defaults to black from the transparent color space.</p>
</div4><div4><head>Purpose</head><p>Specifies the color of the top border.</p></div4></div3><div3 id='border-width-after'><head>border-width-after</head><div4><head>Allowed Values</head><p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p></div4><div4><head>Purpose</head><p>Specifies the width of the after border.</p></div4></div3><div3 id='border-width-before'><head>border-width-before</head><div4><head>Allowed Values</head><p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p></div4><div4><head>Purpose</head><p>Specifies the width of the before border.</p></div4></div3><div3 id='border-width-bottom'><head>border-width-bottom</head><div4><head>Allowed Values</head><p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p></div4><div4><head>Purpose</head><p>Specifies the width of the bottom border.</p></div4></div3><div3 id='border-width-end'><head>border-width-end</head><div4><head>Allowed Values</head><p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p></div4><div4><head>Purpose</head><p>Specifies the width of the end border.</p></div4></div3><div3 id='border-width-left'><head>border-width-left</head><div4><head>Allowed Values</head><p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p></div4><div4><head>Purpose</head><p>Specifies the width of the left border.</p></div4></div3><div3 id='border-width-right'><head>border-width-right</head><div4><head>Allowed Values</head><p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p></div4><div4><head>Purpose</head><p>Specifies the width of the right border.</p></div4></div3><div3 id='border-width-start'><head>border-width-start</head><div4><head>Allowed Values</head><p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p></div4><div4><head>Purpose</head><p>Specifies the width of the start border.</p></div4></div3><div3 id='border-width-top'><head>border-width-top</head><div4><head>Allowed Values</head><p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p></div4><div4><head>Purpose</head><p>Specifies the width of the top border.</p></div4></div3><div3 id='break-after'><head>break-after</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>auto-page : </p>
</item>
<item><p>column : </p>
   
</item>
<item><p>column-group : </p>

</item>
<item><p>none : (Default)</p>
</item>
<item><p>page : </p>
</item>
<item><p>page-region : </p>
   
</item>
</ulist>
</div4><div4><head>Purpose</head><p>Specifies page break behavior after a formatting object.</p></div4></div3><div3 id='break-before'><head>break-before</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>auto-page : </p>
</item>
<item><p>column : </p>
</item>
<item><p>column-group : </p>
 
</item>
<item><p>none : (Default)</p>
</item>
<item><p>page : </p>
   
</item>
<item><p>page-region : </p>
   
</item>
</ulist>
</div4><div4><head>Purpose</head><p>Specifies the page break behavior before a formatting object.</p></div4></div3><div3 id='character'><head>character</head><div4><head>Allowed Values</head><p>A character (See <specref ref='datatypes.char'/>).</p></div4><div4><head>Purpose</head><p>Specifies the Unicode character to be substituted/presented.</p></div4></div3><div3 id='color'><head>color</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>transparent : </p>
</item>
</ulist>
<p>A color (See <specref ref='datatypes.color'/>).</p>
</div4><div4><head>Purpose</head><p>Describes the foreground color of a formatting object's text
content.</p></div4></div3><div3 id='contents-alignment'><head>contents-alignment</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>centered : </p>
</item>
<item><p>end : </p>
</item>
<item><p>justify : </p>
</item>
<item><p>start : </p>
</item>
</ulist>
</div4><div4><head>Purpose</head><p>Specifies the alignment of the child areas within the containing area in the block-progression-direction of the containing area.</p></div4></div3><div3 id='contents-rotation'><head>contents-rotation</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>0 : </p>
</item>
<item><p>90 : </p>
</item>
<item><p>180 : </p>
</item>
<item><p>270 : </p>
</item>
</ulist>
</div4><div4><head>Purpose</head><p>Specifies the counter-clockwise rotation to be applied to the area contents.
</p></div4></div3><div3 id='destination'><head>destination</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>none : </p>
</item>
</ulist>
<p>A URI (See <specref ref='datatypes.uri'/>).</p>
</div4><div4><head>Purpose</head><p>Specifies the destination for the link when activated.</p></div4></div3><div3 id='end-indent'><head>end-indent</head><div4><head>Allowed Values</head><p>A signed length (See <specref ref='datatypes.signed.length'/>).</p></div4><div4><head>Purpose</head><p>Specifies the indent of the end edge of the area in the direction of the inline-progression-direction.</p></div4></div3><div3 id='end-side-overflow'><head>end-side-overflow</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>auto : </p>
</item>
<item><p>hidden : </p>
</item>
<item><p>scroll : </p>
</item>
<item><p>visible : </p>
</item>
</ulist>
</div4><div4><head>Purpose</head><p>Specifies the overflow behavior for the end-side area.</p></div4><div4><head>Description</head><p>Defines behavior when content is larger than region. (See also XSL:flow-type)</p></div4></div3><div3 id='end-side-separation'><head>end-side-separation</head><div4><head>Allowed Values</head><p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p></div4><div4><head>Purpose</head><p>Specifies the distance from the edge of the body area to the adjacent end-side area.
</p></div4></div3><div3 id='end-side-size'><head>end-side-size</head><div4><head>Allowed Values</head><p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p></div4><div4><head>Purpose</head><p>Specifies the width of the end-side area. If the corresponding queue content is absent, this space will still be reserved.
</p></div4></div3><div3 id='end-side-writing-mode'><head>end-side-writing-mode</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>bt-lr : </p>
</item>
<item><p>bt-rl : </p>
</item>
<item><p>lr-alternating-rl-bt : </p>
</item>
<item><p>lr-alternating-rl-tb : </p>
</item>
<item><p>lr-bt : </p>
</item>
<item><p>lr-inverting-rl-bt : </p>
</item>
<item><p>lr-inverting-rl-tb : </p>
</item>
<item><p>lr-tb : </p>
</item>
<item><p>rl-bt : </p>
</item>
<item><p>rl-tb : </p>
</item>
<item><p>tb-lr : </p>
</item>
<item><p>tb-rl : </p>
</item>
<item><p>tb-rl-in-rl-pairs : </p>
</item>
<item><p>use-page-writing-mode : </p>
</item>
</ulist>
</div4><div4><head>Purpose</head><p>Specifies the writing-mode within the end-side area of a simple-page-master.

</p></div4><div4><head>Description</head><p>See the writing-mode property.</p></div4></div3><div3 id='escapement-space-end'><head>escapement-space-end</head><div4><head>Allowed Values</head><p>A space specification (See <specref ref='datatypes.space'/>).</p><glist><gitem><label>Minimum</label><def><p/></def></gitem><gitem><label>Maximum</label><def><p>0.0pt</p></def></gitem><gitem><label>Optimal</label><def><p>0.0pt</p></def></gitem></glist></div4><div4><head>Purpose</head><p>Specifies the space following a glyph-area.</p></div4></div3><div3 id='escapement-space-start'><head>escapement-space-start</head><div4><head>Allowed Values</head><p>A space specification (See <specref ref='datatypes.space'/>).</p><glist><gitem><label>Minimum</label><def><p/></def></gitem><gitem><label>Maximum</label><def><p>0.0pt</p></def></gitem><gitem><label>Optimal</label><def><p>0.0pt</p></def></gitem></glist></div4><div4><head>Purpose</head><p>Specifies the space preceding a glyph-area.</p></div4></div3><div3 id='expand-tabs'><head>expand-tabs</head><div4><head>Allowed Values</head><p>A boolean value (See <specref ref='datatypes.boolean'/>).</p></div4><div4><head>Purpose</head><p>Specifies whether tabs should be expanded according to tab stops.</p></div4></div3><div3 id='first-page-master'><head>first-page-master</head><div4><head>Allowed Values</head><p>A name (See <specref ref='datatypes.name'/>).</p></div4><div4><head>Purpose</head><p>Specifies the name of the page master formatting object to use for the first page.</p></div4></div3><div3 id='font-family'><head>font-family</head><div4><head>Allowed Values</head><p>A font name (See <specref ref='datatypes.fontname'/>).</p></div4><div4><head>Purpose</head><p>Specifies a prioritized list of font family names and/or generic family names.</p></div4></div3><div3 id='font-size'><head>font-size</head><div4><head>Allowed Values</head><p>A signed length (See <specref ref='datatypes.signed.length'/>).</p></div4><div4><head>Purpose</head><p>Specifies the size of the font.</p></div4><div4><head>Description</head><p>This property specifies the size of the font. The final size of the font depend on the availability of fonts and the value of 'font-size-adjust'.</p></div4></div3><div3 id='font-size-adjust'><head>font-size-adjust</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>none : </p>
</item>
</ulist>
<p>An unsigned real value (See <specref ref='datatypes.unsigned.real'/>).</p>
</div4><div4><head>Purpose</head><p>Specifies the ideal ratio between the x-height of a font and the size of the font. </p></div4></div3><div3 id='font-stretch'><head>font-stretch</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>condensed : </p>
</item>
<item><p>expanded : </p>
</item>
<item><p>extra-condensed : </p>
</item>
<item><p>extra-expanded : </p>
</item>
<item><p>narrower : </p>
</item>
<item><p>normal : </p>
</item>
<item><p>semi-condensed : </p>
</item>
<item><p>semi-expanded : </p>
</item>
<item><p>ultra-condensed : </p>
</item>
<item><p>ultra-expanded : </p>
</item>
<item><p>wider : </p>
</item>
</ulist>
</div4><div4><head>Purpose</head><p>Selects a face of a certain width within a font family.</p></div4></div3><div3 id='font-style'><head>font-style</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>italic : </p>
</item>
<item><p>normal : </p>
</item>
<item><p>oblique : </p>
</item>
<item><p>reverse-normal : </p>
</item>
<item><p>reverse-oblique : </p>
</item>
</ulist>
</div4><div4><head>Purpose</head><p>Selects a normal (sometimes referred to as "roman" or "upright"), italic, and oblique face within a font family.</p></div4></div3><div3 id='font-variant'><head>font-variant</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>normal : </p>
</item>
<item><p>small-caps : </p>
</item>
</ulist>
</div4><div4><head>Purpose</head><p>Selects between a normal and small-caps variant of a font face.</p></div4></div3><div3 id='font-weight'><head>font-weight</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>100 : </p>
</item>
<item><p>200 : </p>
</item>
<item><p>300 : </p>
</item>
<item><p>400 : </p>
</item>
<item><p>500 : </p>
</item>
<item><p>600 : </p>
</item>
<item><p>700 : </p>
</item>
<item><p>800 : </p>
</item>
<item><p>900 : </p>
</item>
<item><p>bold : </p>
</item>
<item><p>bolder : </p>
</item>
<item><p>lighter : </p>
</item>
<item><p>normal : </p>
</item>
</ulist>
</div4><div4><head>Purpose</head><p>Specifies the weight of the font.</p></div4></div3><div3 id='footer-overflow'><head>footer-overflow</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>auto : </p>
</item>
<item><p>hidden : </p>
</item>
<item><p>scroll : </p>
</item>
<item><p>visible : </p>
</item>
</ulist>
</div4><div4><head>Purpose</head><p>Specifies the overflow behavior for the footer area.

</p></div4><div4><head>Description</head><p>Defines behavior when content is larger than region. (See also XSL:flow-type)</p></div4></div3><div3 id='footer-separation'><head>footer-separation</head><div4><head>Allowed Values</head><p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p></div4><div4><head>Purpose</head><p>Specifies the distance between the bottom of the body area to the top of the footer area.</p></div4></div3><div3 id='footer-size'><head>footer-size</head><div4><head>Allowed Values</head><p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p></div4><div4><head>Purpose</head><p>Specifies the height of the footer area. </p></div4><div4><head>Description</head><p>Specifies the height of the footer area. If the corresponding queue content is absent, this space will still be reserved.</p></div4></div3><div3 id='footer-writing-mode'><head>footer-writing-mode</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>bt-lr : </p>
</item>
<item><p>bt-rl : </p>
</item>
<item><p>lr-alternating-rl-bt : </p>
</item>
<item><p>lr-alternating-rl-tb : </p>
</item>
<item><p>lr-bt : </p>
</item>
<item><p>lr-inverting-rl-bt : </p>
</item>
<item><p>lr-inverting-rl-tb : </p>
</item>
<item><p>lr-tb : </p>
</item>
<item><p>rl-bt : </p>
</item>
<item><p>rl-tb : </p>
</item>
<item><p>tb-lr : </p>
</item>
<item><p>tb-rl : </p>
</item>
<item><p>tb-rl-in-rl-pairs : </p>
</item>
<item><p>use-page-writing-mode : </p>
</item>
</ulist>
</div4><div4><head>Purpose</head><p>Specifies the writing-mode within the footer area of a simple-page-master.
</p></div4><div4><head>Description</head><p>See the writing-mode property.</p></div4></div3><div3 id='glyph-alignment-mode'><head>glyph-alignment-mode</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>base : </p>
</item>
<item><p>bottom : </p>
</item>
<item><p>center : </p>
</item>
<item><p>font : </p>
</item>
<item><p>left : </p>
</item>
<item><p>math-middle : </p>
</item>
<item><p>middle : </p>
</item>
<item><p>right : </p>
</item>
<item><p>top : </p>
</item>
</ulist>
</div4><div4><head>Purpose</head><p>Used to set the textline's placement-path position relative to the origin of the block-level area.</p></div4></div3><div3 id='glyph-id'><head>glyph-id</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>use-char-map : </p>
</item>
</ulist>
<p>A name (See <specref ref='datatypes.name'/>).</p>
</div4><div4><head>Purpose</head><ednote><edtext>TODO</edtext></ednote></div4></div3><div3 id='header-overflow'><head>header-overflow</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>auto : </p>
</item>
<item><p>hidden : </p>
</item>
<item><p>scroll : </p>
</item>
<item><p>visible : </p>
</item>
</ulist>
</div4><div4><head>Purpose</head><p>Specifies the overflow behavior for the header area.</p></div4><div4><head>Description</head><p>Defines behavior when content is larger than region. (See also XSL:flow-type)</p></div4></div3><div3 id='header-separation'><head>header-separation</head><div4><head>Allowed Values</head><p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p><p>Defaults to 18.0pt.</p></div4><div4><head>Purpose</head><p>Specifies the distance between the top of the body area to the adjacent header area.
</p></div4></div3><div3 id='header-size'><head>header-size</head><div4><head>Allowed Values</head><p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p></div4><div4><head>Purpose</head><p>Specifies the height of the header area. </p></div4><div4><head>Description</head>
<p>Specifies the height of the header area. If the corresponding queue content is absent, this space will still be reserved.</p>
</div4></div3><div3 id='header-writing-mode'><head>header-writing-mode</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>bt-lr : </p>
</item>
<item><p>bt-rl : </p>
</item>
<item><p>lr-alternating-rl-bt : </p>
</item>
<item><p>lr-alternating-rl-tb : </p>
</item>
<item><p>lr-bt : </p>
</item>
<item><p>lr-inverting-rl-bt : </p>
</item>
<item><p>lr-inverting-rl-tb : </p>
</item>
<item><p>lr-tb : </p>
</item>
<item><p>rl-bt : </p>
</item>
<item><p>rl-tb : </p>
</item>
<item><p>tb-lr : </p>
</item>
<item><p>tb-rl : </p>
</item>
<item><p>tb-rl-in-rl-pairs : </p>
</item>
<item><p>use-page-writing-mode : </p>
</item>
</ulist>
</div4><div4><head>Purpose</head><p>Specifies the writing-mode within the header area of a simple-page-master.
</p></div4><div4><head>Description</head><p>See the writing-mode property.</p></div4></div3><div3 id='height'><head>height</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>auto : </p>
</item>
</ulist>
<p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p>
</div4><div4><head>Purpose</head><p>Specifies the content height of boxes.</p></div4></div3><div3 id='href'><head>href</head><div4><head>Allowed Values</head><p>A URI (See <specref ref='datatypes.uri'/>).</p></div4><div4><head>Purpose</head><p>Specifies a URI target.</p></div4></div3><div3 id='hyphenate'><head>hyphenate</head><div4><head>Allowed Values</head><p>A boolean value (See <specref ref='datatypes.boolean'/>).</p></div4><div4><head>Purpose</head><p>Specifies whether hyphenation is allowed.</p></div4></div3><div3 id='hyphenation-char'><head>hyphenation-char</head><div4><head>Allowed Values</head><p>A character (See <specref ref='datatypes.char'/>).</p></div4><div4><head>Purpose</head><p>Specifies the character to be inserted on automatic hyphenation.</p></div4></div3><div3 id='hyphenation-keep'><head>hyphenation-keep</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>column : </p>
</item>
<item><p>none : </p>
</item>
<item><p>page : </p>
</item>
<item><p>spread : </p>
</item>
</ulist>
</div4><div4><head>Purpose</head><p>Specifies the hyphenation constraints.</p></div4><div4><head>Description</head><p>This property specifies the hyphenation constraints when at the end of a facing page pair or column.</p></div4></div3><div3 id='hyphenation-ladder-count'><head>hyphenation-ladder-count</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>none : </p>
</item>
</ulist>
<p>An unsigned integer value (See <specref ref='datatypes.unsigned.integer'/>).</p>
</div4><div4><head>Purpose</head><p>Specifies the limit of number of successive hyphenated lines.</p></div4><div4><head>Description</head><p>This property specifies the limit number of successive hyphenated lines.</p></div4></div3><div3 id='hyphenation-push-char-count'><head>hyphenation-push-char-count</head><div4><head>Allowed Values</head><p>An unsigned integer value (See <specref ref='datatypes.unsigned.integer'/>).</p></div4><div4><head>Purpose</head><p>Specifies the minimum number of characters that must follow an automatically inserted hyphen.</p></div4></div3><div3 id='hyphenation-remain-char-count'><head>hyphenation-remain-char-count</head><div4><head>Allowed Values</head><p>An unsigned integer value (See <specref ref='datatypes.unsigned.integer'/>).</p></div4><div4><head>Purpose</head><p>Specifies the minimum number of characters the must precede an automatically inserted hyphen.</p></div4></div3><div3 id='id'><head>id</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>none : </p>
</item>
</ulist>
<p>An id(See <specref ref='datatypes.id'/>).</p>
</div4><div4><head>Purpose</head><p>Specifies a unique identifier for this object within all members of the formatter-object-tree.</p></div4><div4><head>Description</head><p>A unique identifier within all members of the formatter-object tree that allows references to this object.</p></div4></div3><div3 id='ignore-record-end'><head>ignore-record-end</head><div4><head>Allowed Values</head><p>A boolean value (See <specref ref='datatypes.boolean'/>).</p></div4><div4><head>Purpose</head><p>Specifies whether a record-end shall be ignored. </p></div4><div4><head>Description</head><p>Specifies whether a record-end shall be ignored. If this property is true, then a character with the char-is-record-end qualifier true shall be ignored.
</p></div4></div3><div3 id='image'><head>image</head><div4><head>Allowed Values</head><p>A URI (See <specref ref='datatypes.uri'/>).</p></div4><div4><head>Purpose</head><p>Specifies the location of the image.</p></div4></div3><div3 id='inhibit-line-breaks'><head>inhibit-line-breaks</head><div4><head>Allowed Values</head><p>A boolean value (See <specref ref='datatypes.boolean'/>).</p></div4><div4><head>Purpose</head><p>Specifies whether line breaks are allowed.</p></div4><div4><head>Description</head><p>This property controls the behavior of line breaking within or between areas produced by formatting objects.  When this property is true no line breaks are allowed.</p></div4></div3><div3 id='input-whitespace-treatment'><head>input-whitespace-treatment</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>preserve : </p></item>
<item><p>collapse : </p></item>
<item><p>ignore : </p></item>
</ulist>
</div4><div4><head>Purpose</head><p>Specifies treatment of whitespace from the source document.</p></div4></div3><div3 id='keep'><head>keep</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>avoid : </p>
<p>Specifies that the formatter should avoid breaking a page inside the areas generated by object to which this property applies.</p>
</item>
<item><p>auto : </p>
<p>Specifies that the formatter should use the system default for determining how to breaking a page inside the areas generated by object to which this property applies.</p>
</item>
</ulist>
</div4><div4><head>Purpose</head><p>Describes a page break behavior inside a formatting object.</p></div4></div3><div3 id='keep-with-next'><head>keep-with-next</head><div4><head>Allowed Values</head><p>A boolean value (See <specref ref='datatypes.boolean'/>).</p></div4><div4><head>Purpose</head><p>Specifies whether the formatting object shall be kept in the same area as the next formatting object.
</p></div4></div3><div3 id='keep-with-previous'><head>keep-with-previous</head><div4><head>Allowed Values</head><p>A boolean value (See <specref ref='datatypes.boolean'/>).</p></div4><div4><head>Purpose</head><p>Specifies whether the formatting object shall be kept in the same area as the previous formatting object.
</p></div4></div3><div3 id='kern'><head>kern</head><div4><head>Allowed Values</head><p>A boolean value (See <specref ref='datatypes.boolean'/>).</p></div4><div4><head>Purpose</head><p>Specifies whether kerning (placement-adjustment) is allowed.
</p></div4></div3><div3 id='kern-mode'><head>kern-mode</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>loose : </p>
</item>
<item><p>normal : (Default)</p>
</item>
<item><p>tight : </p>
</item>
<item><p>touch : </p>
</item>
</ulist>
</div4><div4><head>Purpose</head><p>Specifies the placement adjustment mode.</p></div4></div3><div3 id='language'><head>language</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>none : </p>
   <p>disables hyphenation and forces a simple line-breaking strategy. Used for program text and poetry.

</p>
</item>
<item><p>use-document : </p>
   <p>Specifies one should use the language/country/script specified in the source document's xml:lang specifier.</p>
</item>
</ulist>
<p>A language (See <specref ref='datatypes.language'/>).</p>
</div4><div4><head>Purpose</head><p>Specifies the language in which the content is written. </p></div4></div3><div3 id='left'><head>left</head><div4><head>Allowed Values</head><p>A signed length (See <specref ref='datatypes.signed.length'/>).</p></div4><div4><head>Purpose</head><p>Specifies how far a box's left content edge is offset to the right of the left edge of the box's containing block.</p></div4></div3><div3 id='length'><head>length</head><div4><head>Allowed Values</head><p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p></div4><div4><head>Purpose</head><p>Specifies the the length (width).</p></div4></div3><div3 id='letter-spacing'><head>letter-spacing</head><div4><head>Allowed Values</head><p>A space specification (See <specref ref='datatypes.space'/>).</p><glist><gitem><label>Minimum</label><def><p/></def></gitem><gitem><label>Maximum</label><def><p>0.0pt</p></def></gitem><gitem><label>Optimal</label><def><p>0.0pt</p></def></gitem></glist></div4><div4><head>Purpose</head><p>Specifies spacing behavior between text characters.</p></div4></div3><div3 id='letter-spacing-limit'><head>letter-spacing-limit</head><div4><head>Allowed Values</head><p>A limit specification (See <specref ref='datatypes.limit'/>).</p><glist><gitem><label>Minimum</label><def><p/></def></gitem><gitem><label>Maximum</label><def><p>0.0pt</p></def></gitem></glist></div4><div4><head>Purpose</head><p>Specifies the minimum and maximum amount of letter spacing that may be applied.</p></div4></div3><div3 id='ligature'><head>ligature</head><div4><head>Allowed Values</head><p>A boolean value (See <specref ref='datatypes.boolean'/>).</p></div4><div4><head>Purpose</head><p>Specifies whether ligatures are allowed.</p></div4></div3><div3 id='line-height'><head>line-height</head><div4><head>Allowed Values</head><p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p></div4><div4><head>Purpose</head><p>Specifies the
minimal height of the generated areas.</p></div4><div4><head>Description</head><p>In an block formatting context, this property specifies the
minimal height of the generated inline areas. In an inline formatting context, this property specifies the exact height of the generated areas. 

</p></div4></div3><div3 id='line-height-option'><head>line-height-option</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>consider-shifts : </p>
</item>
<item><p>disregard-shifts : </p>
</item>
</ulist>
</div4><div4><head>Purpose</head><p>Specifies whether line spacing should consider superior and inferior text in deriving the line height.</p></div4></div3><div3 id='line-offset'><head>line-offset</head><div4><head>Allowed Values</head><p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p></div4><div4><head>Purpose</head><p>Specifies the offset distance from the alignment-line to the line.</p></div4></div3><div3 id='line-spacing-precedence'><head>line-spacing-precedence</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>force : </p>
</item>
</ulist>
<p>An unsigned integer value (See <specref ref='datatypes.unsigned.integer'/>).</p>
</div4><div4><head>Purpose</head><p>Specifies a precendence for display-space which is generated as a result of the line spacing calculations.</p></div4></div3><div3 id='line-thickness'><head>line-thickness</head><div4><head>Allowed Values</head><p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p></div4><div4><head>Purpose</head><p>Specifies the thickness of the line.</p></div4></div3><div3 id='margin-end'><head>margin-end</head><div4><head>Allowed Values</head><p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p><p>Defaults to 0.0pt.</p></div4><div4><head>Purpose</head><p>Specifies the width of the unprinted area measured inward from the end edge of any area.

</p></div4><div4><head>Description</head><p>Specifies the distance from the edge of the resulting area that is last in the block-progression-direction's block-progression-direction to the nearest edge of the text area.</p></div4></div3><div3 id='margin-start'><head>margin-start</head><div4><head>Allowed Values</head><p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p><p>Defaults to 0.0pt.</p></div4><div4><head>Purpose</head><p>Specifies the width of the unprinted area measured inward from the start edge of any area.

</p></div4><div4><head>Description</head><p>Specifies the distance from the edge of the resulting area that is first in the block-progression-direction's block-progression-direction to the nearest edge of the text area.

</p></div4></div3><div3 id='max-height'><head>max-height</head><div4><head>Allowed Values</head><p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p></div4><div4><head>Purpose</head><p>Specifies the maximum height of the content area.</p></div4></div3><div3 id='max-width'><head>max-width</head><div4><head>Allowed Values</head><p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p></div4><div4><head>Purpose</head><p>Specifies the maximum width of the content area.</p></div4></div3><div3 id='merge-link-end-indicators'><head>merge-link-end-indicators</head><div4><head>Allowed Values</head><p>A boolean value (See <specref ref='datatypes.boolean'/>).</p></div4><div4><head>Purpose</head><p>Specifies whether nested links are shown separately.</p></div4><div4><head>Description</head><p>If this link formatting object occurs within another, and merge-link-end-locators is true, then the effect is the same as if the link-end-locators of the ancestor were also link-end-locators of this link. In other words, the link-end-locators of the ancestor and those of this link are potential destinations when the user selects this link. If merge-link-end-locators is false, then only the link-end-locators associated with this link are potential destinations from this link.
</p></div4></div3><div3 id='min-leading'><head>min-leading</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>none : </p>
</item>
</ulist>
<p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p>
</div4><div4><head>Purpose</head><p>Specifies the minimum addition space that must be guaranteed between two lines.</p></div4><div4><head>Description</head><p>This property specifies the minimum addition space that must be guaranteed between two lines.  It is used in the calculation of the size of the maximum-line-rectangle.</p></div4></div3><div3 id='min-post-line-spacing'><head>min-post-line-spacing</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>use-font-metrics : </p>
</item>
</ulist>
<p>A signed length (See <specref ref='datatypes.signed.length'/>).</p>
</div4><div4><head>Purpose</head><p>Overrides the default ascender-depth.</p></div4><div4><head>Description</head><p>See ascender-depth.</p></div4></div3><div3 id='min-pre-line-spacing'><head>min-pre-line-spacing</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>use-font-metrics : </p>
</item>
</ulist>
<p>A signed length (See <specref ref='datatypes.signed.length'/>).</p>
</div4><div4><head>Purpose</head><p>Overrides the default ascender-height.</p></div4><div4><head>Description</head><p>See ascender-height.</p></div4></div3><div3 id='orientation'><head>orientation</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>escapement : </p>
</item>
<item><p>horizontal : </p>
</item>
<item><p>line-progression : </p>
</item>
<item><p>vertical : </p>
</item>
</ulist>
</div4><div4><head>Purpose</head><p>Specifies the orientation of a rule.</p></div4></div3><div3 id='orphans'><head>orphans</head><div4><head>Allowed Values</head><p>An unsigned integer value (See <specref ref='datatypes.unsigned.integer'/>).</p></div4><div4><head>Purpose</head><p>Specifies the minimum number of lines of a paragraph that must be left at the bottom of a page. </p></div4></div3><div3 id='overflow'><head>overflow</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>auto : </p>
</item>
<item><p>hidden : </p>
</item>
<item><p>scroll : </p>
</item>
<item><p>visible : </p>
</item>
</ulist>
</div4><div4><head>Purpose</head><p>Specifies the action to be taken if the content of the area does not fit within the dimensions specified for the area.</p></div4><div4><head>Description</head><p>Defines behavior when content is larger than region.</p></div4></div3><div3 id='padding-after'><head>padding-after</head><div4><head>Allowed Values</head><p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p></div4><div4><head>Purpose</head><p>Specifies the width of the after padding area.</p></div4></div3><div3 id='padding-before'><head>padding-before</head><div4><head>Allowed Values</head><p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p></div4><div4><head>Purpose</head><p>Specifies the width of the before padding area.</p></div4></div3><div3 id='padding-bottom'><head>padding-bottom</head><div4><head>Allowed Values</head><p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p></div4><div4><head>Purpose</head><p>Specifies the width of the bottom padding area.</p></div4></div3><div3 id='padding-end'><head>padding-end</head><div4><head>Allowed Values</head><p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p></div4><div4><head>Purpose</head><p>Specifies the width of the end padding area.</p></div4></div3><div3 id='padding-left'><head>padding-left</head><div4><head>Allowed Values</head><p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p></div4><div4><head>Purpose</head><p>Specifies the width of the left padding area.</p></div4></div3><div3 id='padding-right'><head>padding-right</head><div4><head>Allowed Values</head><p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p></div4><div4><head>Purpose</head><p>Specifies the width of the right padding area.</p></div4></div3><div3 id='padding-start'><head>padding-start</head><div4><head>Allowed Values</head><p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p></div4><div4><head>Purpose</head><p>Specifies the width of the start padding area.</p></div4></div3><div3 id='padding-top'><head>padding-top</head><div4><head>Allowed Values</head><p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p></div4><div4><head>Purpose</head><p>Specifies the width of the top padding area.</p></div4></div3><div3 id='page-height'><head>page-height</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>auto : </p>
   <p>Specifies that the formatter will determine the height of the page.</p>
</item>
</ulist>
<p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p>
</div4><div4><head>Purpose</head><p>Specifies the total height of the page.</p></div4></div3><div3 id='page-margin-bottom'><head>page-margin-bottom</head><div4><head>Allowed Values</head><p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p></div4><div4><head>Purpose</head><p>Specifies the width of the unprinted area measured inward from the bottom edge of the page area.</p></div4></div3><div3 id='page-margin-left'><head>page-margin-left</head><div4><head>Allowed Values</head><p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p></div4><div4><head>Purpose</head><p>Specifies the width of the unprinted area measured inward from the left edge of the page area.</p></div4></div3><div3 id='page-margin-right'><head>page-margin-right</head><div4><head>Allowed Values</head><p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p></div4><div4><head>Purpose</head><p>Specifies the width of the unprinted area measured inward from the right edge of the page area.</p></div4></div3><div3 id='page-margin-top'><head>page-margin-top</head><div4><head>Allowed Values</head><p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p></div4><div4><head>Purpose</head><p>Specifies the width of the unprinted area measured inward from the top edge of the page area.</p></div4></div3><div3 id='page-master-name'><head>page-master-name</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>first : </p>
</item>
<item><p>repeating : </p>
</item>
<item><p>even : </p>
</item>
<item><p>odd : </p>
</item>
<item><p>scrolling : </p>
</item>
</ulist>
<p>A name (See <specref ref='datatypes.name'/>).</p>
</div4><div4><head>Purpose</head><p>Specifies the name of the page master.</p></div4></div3><div3 id='page-width'><head>page-width</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>auto : </p>
</item>
</ulist>
<p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p>
</div4><div4><head>Purpose</head><p>Specifies the size and orientation of a page box. </p></div4></div3><div3 id='page-writing-mode'><head>page-writing-mode</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>bt-lr : </p>
</item>
<item><p>bt-rl : </p>
</item>
<item><p>lr-alternating-rl-bt : </p>
</item>
<item><p>lr-alternating-rl-tb : </p>
</item>
<item><p>lr-bt : </p>
</item>
<item><p>lr-inverting-rl-bt : </p>
</item>
<item><p>lr-inverting-rl-tb : </p>
</item>
<item><p>lr-tb : </p>
</item>
<item><p>rl-bt : </p>
</item>
<item><p>rl-tb : </p>
</item>
<item><p>tb-lr : </p>
</item>
<item><p>tb-rl : </p>
</item>
<item><p>tb-rl-in-rl-pairs : </p>
</item>
</ulist>
</div4><div4><head>Purpose</head><p>Specifies the writing-mode and layout directions for a page in a simple-page-master.

</p></div4><div4><head>Description</head><p>See the writing-mode property.</p></div4></div3><div3 id='position-point'><head>position-point</head><div4><head>Allowed Values</head><p>A an x-y coordinate (See <specref ref='datatypes.coordinate'/>).</p></div4><div4><head>Purpose</head><p>Specifies the position in terms of a coordinate.</p></div4></div3><div3 id='provisional-distance-between-starts'><head>provisional-distance-between-starts</head><div4><head>Allowed Values</head><p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p></div4><div4><head>Purpose</head><p>Specifies the default distance between the start-edge list-item-label and the start-edge of the list-item-body.</p></div4><div4><head>Description</head><p>Used to calculate: magic-label-end = (container? width - (list-block:provisional-distance-between-starts + list-block:start-indent - list-block:provisional-label-separation));</p></div4></div3><div3 id='provisional-label-separation'><head>provisional-label-separation</head><div4><head>Allowed Values</head><p>A space specification (See <specref ref='datatypes.space'/>).</p><glist><gitem><label>Minimum</label><def><p/></def></gitem><gitem><label>Maximum</label><def><p>0.0pt</p></def></gitem><gitem><label>Optimal</label><def><p>0.0pt</p></def></gitem></glist></div4><div4><head>Purpose</head><p>Specifies the default distance between the list-item-label and the list-item-body.</p></div4><div4><head>Description</head><p>Used to calculate: magic-label-end = (container? width - (list-block:provisional-distance-between-starts + list-block:start-indent - list-block:provisional-label-separation));</p></div4></div3><div3 id='queue-name'><head>queue-name</head><div4><head>Allowed Values</head><p>A name (See <specref ref='datatypes.name'/>).</p></div4><div4><head>Purpose</head><p>Defines the name of the queue.</p></div4></div3><div3 id='repeating-even-page-master'><head>repeating-even-page-master</head><div4><head>Allowed Values</head><p>A name (See <specref ref='datatypes.name'/>).</p></div4><div4><head>Purpose</head><p>Specifies the name of the page master formatting object to use for the repeating even pages.</p></div4></div3><div3 id='repeating-odd-page-master'><head>repeating-odd-page-master</head><div4><head>Allowed Values</head><p>A name (See <specref ref='datatypes.name'/>).</p></div4><div4><head>Purpose</head><p>Specifies the name of the page master formatting object to use for the repeating odd pages.</p></div4></div3><div3 id='scale-graphic'><head>scale-graphic</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>max : </p></item>
<item><p>max-uniform : </p></item>
</ulist>
<p>An signed real value (See <specref ref='datatypes.signed.real'/>).</p>
</div4><div4><head>Purpose</head><p>Specifies whether a graphic should be automatically or manually scaled.</p></div4></div3><div3 id='score-spaces'><head>score-spaces</head><div4><head>Allowed Values</head><p>A boolean value (See <specref ref='datatypes.boolean'/>).</p></div4><div4><head>Purpose</head><p>Specifies whether the scoring shall be applied to spaces.
</p></div4><div4><head>Description</head><p>A value of true means that scoring will be applied to spaces.</p></div4></div3><div3 id='show-content'><head>show-content</head><div4><head>Allowed Values</head><p>A boolean value (See <specref ref='datatypes.boolean'/>).</p></div4><div4><head>Purpose</head><p>Specifies whether the content of the link should be displayed.</p></div4></div3><div3 id='space-after'><head>space-after</head><div4><head>Allowed Values</head><p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p></div4><div4><head>Purpose</head><p>Specifies the desired space following the after-edge any area.</p></div4></div3><div3 id='space-before'><head>space-before</head><div4><head>Allowed Values</head><p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p></div4><div4><head>Purpose</head><p>Specifies the desired space preceding the before-edge any area.</p></div4></div3><div3 id='space-between-list-rows'><head>space-between-list-rows</head><div4><head>Allowed Values</head><p>A space specification (See <specref ref='datatypes.space'/>).</p><glist><gitem><label>Minimum</label><def><p/></def></gitem><gitem><label>Maximum</label><def><p>0.0pt</p></def></gitem><gitem><label>Optimal</label><def><p>0.0pt</p></def></gitem></glist></div4><div4><head>Purpose</head><p>Specifies the nominal space between list items within a list block.</p></div4></div3><div3 id='space-end'><head>space-end</head><div4><head>Allowed Values</head><p>A space specification (See <specref ref='datatypes.space'/>).</p><glist><gitem><label>Minimum</label><def><p/></def></gitem><gitem><label>Maximum</label><def><p>0.0pt</p></def></gitem><gitem><label>Optimal</label><def><p>0.0pt</p></def></gitem></glist></div4><div4><head>Purpose</head><p>Specifies the desired space on the following the end-edge of any area.</p></div4></div3><div3 id='space-start'><head>space-start</head><div4><head>Allowed Values</head><p>A space specification (See <specref ref='datatypes.space'/>).</p><glist><gitem><label>Minimum</label><def><p/></def></gitem><gitem><label>Maximum</label><def><p>0.0pt</p></def></gitem><gitem><label>Optimal</label><def><p>0.0pt</p></def></gitem></glist></div4><div4><head>Purpose</head><p>Specifies the desired space preceding the start-edge any area.</p></div4></div3><div3 id='start-indent'><head>start-indent</head><div4><head>Allowed Values</head><p>A signed length (See <specref ref='datatypes.signed.length'/>).</p></div4><div4><head>Purpose</head><p>Specifies the indent of the starting edge of the area in the direction of the inline-progression-direction.</p></div4></div3><div3 id='start-side-overflow'><head>start-side-overflow</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>auto : </p>
</item>
<item><p>hidden : </p>
</item>
<item><p>scroll : </p>
</item>
<item><p>visible : </p>
</item>
</ulist>
</div4><div4><head>Purpose</head><p>Specifies the overflow behavior for the start-side area.

</p></div4><div4><head>Description</head><p>Defines behavior when content is larger than region. (See also XSL:flow-type)</p></div4></div3><div3 id='start-side-separation'><head>start-side-separation</head><div4><head>Allowed Values</head><p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p></div4><div4><head>Purpose</head><p>Specifies the distance from the edge of the body area to the adjacent start-side area.</p></div4></div3><div3 id='start-side-size'><head>start-side-size</head><div4><head>Allowed Values</head><p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p></div4><div4><head>Purpose</head><p>Specifies the width of the start-side area.</p></div4><div4><head>Description</head><p>Specifies the width of the start-side area. If the corresponding queue content is absent, this space will still be reserved.

</p></div4></div3><div3 id='start-side-writing-mode'><head>start-side-writing-mode</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>bt-lr : </p>
</item>
<item><p>bt-rl : </p>
</item>
<item><p>lr-alternating-rl-bt : </p>
</item>
<item><p>lr-alternating-rl-tb : </p>
</item>
<item><p>lr-bt : </p>
</item>
<item><p>lr-inverting-rl-bt : </p>
</item>
<item><p>lr-inverting-rl-tb : </p>
</item>
<item><p>lr-tb : </p>
</item>
<item><p>rl-bt : </p>
</item>
<item><p>rl-tb : </p>
</item>
<item><p>tb-lr : </p>
</item>
<item><p>tb-rl : </p>
</item>
<item><p>tb-rl-in-rl-pairs : </p>
</item>
<item><p>use-page-writing-mode : </p>
</item>
</ulist>
</div4><div4><head>Purpose</head><p>Specifies the writing-mode within the start-side area of a simple-page-master.
</p></div4><div4><head>Description</head><p>See the writing-mode property.</p></div4></div3><div3 id='system-font'><head>system-font</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>caption : </p>
</item>
<item><p>icon : </p>
</item>
<item><p>menu : </p>
</item>
<item><p>message-box : </p>
</item>
<item><p>small-caption : </p>
</item>
<item><p>status-bar : </p>
</item>
</ulist>
</div4><div4><head>Purpose</head><p>Specifies the system font to be used.</p></div4></div3><div3 id='text-align'><head>text-align</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>centered : </p>
</item>
<item><p>end : </p>
</item>
<item><p>justify : </p>
</item>
<item><p>page-inside : </p>
</item>
<item><p>page-outside : </p>
</item>
<item><p>start : </p>
</item>
</ulist>
</div4><div4><head>Purpose</head><p>Describes how inline content of a block is aligned.</p></div4></div3><div3 id='text-align-last'><head>text-align-last</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>centered : </p>
</item>
<item><p>end : </p>
</item>
<item><p>justify : </p>
</item>
<item><p>page-inside : </p>
</item>
<item><p>page-outside : </p>
</item>
<item><p>relative : </p>
</item>
<item><p>start : </p>
</item>
</ulist>
</div4><div4><head>Purpose</head><p>Specifies the alignment of the last textline in the block in the line-progression-direction determined by the writing-mode.
</p></div4><div4><head>Description</head><p>
A value of auto specifies that the value of the text-align property shall be used, except when that value is justify or justify-force, in which case, a value of start shall be used.
</p>
<p>
A value of spread-inside or spread-outside shall be allowed only if the formatting object has an ancestor of class page-master. A value of page-inside or page-outside shall be allowed only if the formatting object has an ancestor of column-set-master.
</p></div4></div3><div3 id='text-indent'><head>text-indent</head><div4><head>Allowed Values</head><p>A signed length (See <specref ref='datatypes.signed.length'/>).</p></div4><div4><head>Purpose</head><p>Specifies the indentation of the first line of text in a block.</p></div4></div3><div3 id='text-shadow'><head>text-shadow</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>none : </p>
<p>Specifies that no shadow should be used for text.</p>
</item>
</ulist>
<p>A color (See <specref ref='datatypes.color'/>).</p>
</div4><div4><head>Purpose</head><p>Specifies the shadow effects that should be applied to the text.</p></div4></div3><div3 id='vertical-align'><head>vertical-align</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>baseline : </p>
</item>
<item><p>bottom : </p>
</item>
<item><p>middle : </p>
</item>
<item><p>sub : </p>
</item>
<item><p>super : </p>
</item>
<item><p>text-bottom : </p>
</item>
<item><p>text-top : </p>
</item>
<item><p>top : </p>
</item>
</ulist>
<p>A signed length (See <specref ref='datatypes.signed.length'/>).</p>
</div4><div4><head>Purpose</head><p>Describes how a formatting object is positioned inside a line box.</p></div4></div3><div3 id='widows'><head>widows</head><div4><head>Allowed Values</head><p>An unsigned integer value (See <specref ref='datatypes.unsigned.integer'/>).</p></div4><div4><head>Purpose</head><p>Specifies the minimum number of lines of a paragraph that must be left at the top of a page.</p></div4></div3><div3 id='width'><head>width</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>auto : </p>
</item>
</ulist>
<p>An unsigned length (See <specref ref='datatypes.unsigned.length'/>).</p>
</div4><div4><head>Purpose</head><p>Specifies the content width of boxes.</p></div4></div3><div3 id='word-spacing'><head>word-spacing</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>normal : </p>
</item>
</ulist>
<p>A space specification (See <specref ref='datatypes.space'/>).</p><glist><gitem><label>Minimum</label><def><p/></def></gitem><gitem><label>Maximum</label><def><p>0.0pt</p></def></gitem><gitem><label>Optimal</label><def><p>0.0pt</p></def></gitem></glist>
</div4><div4><head>Purpose</head><p>Specifies spacing behavior between words.</p></div4></div3><div3 id='word-spacing-limit'><head>word-spacing-limit</head><div4><head>Allowed Values</head><p>A limit specification (See <specref ref='datatypes.limit'/>).</p><glist><gitem><label>Minimum</label><def><p/></def></gitem><gitem><label>Maximum</label><def><p>0.0pt</p></def></gitem></glist></div4><div4><head>Purpose</head><p>Specifies the minimum and maximum amount of word spacing that may be applied.</p></div4><div4><head>Description</head><p>This value indicates the amount of inter-word space to be added to each the normal space between words. The value may be negative (indicating the amount of space to remove). There may be implementation specific limits on the length specified. The application may also adjust inter-word spacing to justify the line.
</p></div4></div3><div3 id='wrap-option'><head>wrap-option</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>normal : </p>
</item>
<item><p>no-wrap : </p>
</item>
<item><p>pre : </p>
</item>
<item><p>asis-overrun : </p>
</item>
<item><p>asis-truncate : </p>
</item>
<item><p>asis-wrap : </p>
</item>
<item><p>wrap : </p>
</item>
</ulist>
</div4><div4><head>Purpose</head><p>Show whitespace inside the formatting object is to be handled.</p></div4></div3><div3 id='writing-mode'><head>writing-mode</head><div4><head>Allowed Values</head>
<p>One of the following:</p><ulist>
<item><p>bt-lr : </p>
   
<p>Specifies:</p>
<ulist><item><p>The inline-progression-direction &amp; escapement-progression-direction
are set to bottom-to-top.</p></item>
<item><p>The block-progression-direction and line-progression-direction
are top-to-bottom.</p></item>
<item><p>The shift-direction is right-to-left.</p></item></ulist>
   
</item>
<item><p>bt-rl : </p>
   
<p>Specifies:</p>
<ulist><item><p>The inline-progression-direction &amp; escapement-progression-direction
are set to bottom-to-top.</p></item>
<item><p>The block-progression-direction and line-progression-direction
are right-to-left.</p></item>
<item><p>The shift-direction is left-to-right.</p></item></ulist>
   
</item>
<item><p>lr-alternating-rl-bt : </p>
   
<p>Specifies:</p>
<ulist><item><p>The first line's inline-progression-direction &amp; escapement-progression-direction are
set to left-to-right. The second line's inline-progression-direction &amp; escapement-progression-direction
are right-to-left. This alternating direction pattern continues through
the end of the block.</p></item>
<item><p>The block-progression-direction and line-progression-direction
are bottom-to-top.</p></item>
<item><p>The shift-direction is top-to-bottom.</p></item></ulist>
   
</item>
<item><p>lr-alternating-rl-tb : </p>
   
<p>Specifies:</p>
<ulist><item><p>The first line's inline-progression-direction &amp; escapement-progression-direction are
set to left-to-right. The second line's inline-progression-direction &amp; escapement-progression-direction
are right-to-left. This alternating direction pattern continues through
the end of the block.</p></item>
<item><p>The block-progression-direction and line-progression-direction
are top-to-bottom.</p></item>
<item><p>The shift-direction is bottom-to-top.</p></item></ulist>
   
</item>
<item><p>lr-bt : </p>
   
<p>Specifies:</p>
<ulist><item><p>The inline-progression-direction &amp; escapement-progression-direction
are set to left-to-right.</p></item>
<item><p>The block-progression-direction and line-progression-direction
are bottom-to-top.</p></item>
<item><p>The shift-direction is bottom-to-top.</p></item></ulist>   
</item>
<item><p>lr-inverting-rl-bt : </p>
   
<p>Specifies:</p>
<ulist><item><p>The first line's inline-progression-direction &amp; escapement-progression-direction are
set to left-to-right. The second line is written upside-down in
the opposite direction. This alternating direction pattern continues
through the end of the block.</p></item>
<item><p>The block-progression-direction and line-progression-direction
are bottom-to-top.</p></item>
<item><p>Lines that are written left-to-right have a shift-direction
of bottom-to-top. Lines that are written inverted and right-to-left
have a shift-direction of top-to-bottom.</p></item></ulist>
   
</item>
<item><p>lr-inverting-rl-tb : </p>
   
<p>Specifies:</p>
<ulist><item><p>The first line's inline-progression-direction &amp; escapement-progression-direction are
set to left-to-right. The second line is written upside-down in
the opposite direction. This alternating direction pattern continues
through the end of the block.</p></item>
<item><p>The block-progression-direction and line-progression-direction
are top-to-bottom.</p></item>
<item><p>Lines that are written left-to-right have a shift-direction
of bottom-to-top. Lines that are written inverted and right-to-left
have a shift-direction of top-to-bottom.</p></item></ulist>
   
</item>
<item><p>lr-tb : </p>
   <p>Specifies (European,
most western languages) :</p>
<ulist><item><p>The inline-progression-direction &amp; escapement-progression-direction
are set to left-to-right.</p></item>
<item><p>The block-progression-direction and line-progression-direction
are top-to-bottom.</p></item>
<item><p>The shift-direction is bottom-to-top.</p></item></ulist>
</item>
<item><p>rl-bt : </p>
   
<p>Specifies:</p>
<ulist><item><p>The inline-progression-direction &amp; escapement-progression-direction
are set to right-to-left.</p></item>
<item><p>The block-progression-direction and line-progression-direction
are bottom-to-top.</p></item>
<item><p>The shift-direction is bottom-to-top.</p></item></ulist>
   
</item>
<item><p>rl-tb : </p>
   
<p>Specifies (Arabic/Hebrew):</p>
<ulist><item><p>The inline-progression-direction &amp; escapement-progression-direction
are set to right-to-left.</p></item>
<item><p>The block-progression-direction and line-progression-direction
are top-to-bottom.</p></item>
<item><p>The shift-direction is bottom-to-top.</p></item></ulist>
   
</item>
<item><p>tb-lr : </p>
   
<p>Specifies (Mongolian,
western signage):</p>
<ulist><item><p>The inline-progression-direction &amp; escapement-progression-direction
are set to top-to-bottom.</p></item>
<item><p>The block-progression-direction and line-progression-direction
are left-to-right.</p></item>
<item><p>The shift-direction is left-to-right.</p></item></ulist>
   
</item>
<item><p>tb-rl : </p>
   
<p>Specifies (CJK):</p>
<ulist><item><p>The inline-progression-direction &amp; escapement-progression-direction
are set to top-to-bottom.</p></item>
<item><p>The block-progression-direction and line-progression-direction
are right-to-left.</p></item>
<item><p>The shift-direction is left-to-right.</p></item></ulist>
   
</item>
<item><p>tb-rl-in-rl-pairs : </p>
   
<p>Specifies (Korea):</p>
<ulist><item><p>Two characters are placed beside each other in a
right-to-left order. These pairs are stacked into a top-to-bottom
row (line). Inlines are treated like a character-pair.</p></item>
<item><p>The inline-progression-direction is set to top-to-bottom.</p></item>
<item><p>The block-progression-direction and line-progression-direction
are right-to-left.</p></item>
<item><p>The shift-direction is left-to-right.</p></item></ulist>
   
</item>
<item><p>use-page-writing-mode : </p>
   <p>Uses the inherited writing-mode value from the writing-mode of the page.</p>
</item>
</ulist>
</div4><div4><head>Purpose</head><p>This property sets the text orientation, block-progression-direction,
line-progression-direction, inline-progression-direction, and escapement-direction.</p></div4></div3></div2><div2><head>Datatypes</head>

<!-- Missing frequency, country, and pattern -->

<div3 id="datatypes.name"><head>Name</head>
<p>An string of characters conforming to the XML NMTOKEN definition.</p>
</div3>

<div3 id="datatypes.id"><head>ID</head>
<p>A string of characters conforming to the XML NMTOKEN definition that is unique within the stylesheet.</p>
</div3>

<div3 id="datatypes.idref"><head>IDREF</head>
<p>A string of characters conforming to the XML NMTOKEN definition that uses a ID property value used within the stylesheet.</p>
</div3>

<div3 id="datatypes.boolean"><head>Boolean</head>
<p>A boolean value where the allowed values are the strings 'true' and 'false'.</p>
</div3>

<div3 id="datatypes.char"><head>Char</head>
<p>A single unicode character value--whitespace is not allowed.</p>
</div3>

<div3 id="datatypes.coordinate"><head>Coordinate</head>
<p>A pair of signed real values separated by a comma.</p>
<ednote><edtext>Is the comman appropriate here?</edtext></ednote>
</div3>

<div3 id="datatypes.signed.length"><head>Signed Length</head>
<p>A signed length value where a 'length' is a real number plus a unit qualification.  <!--(See <specref ref="quantities"/>)-->.</p>
</div3>

<div3 id="datatypes.unsigned.length"><head>Unsigned Length</head>
<p>An unsigned length value including zero where a 'length' is a real number plus a unit qualification.  <!--(See <specref ref="quantities"/>)-->.</p>
</div3>

<div3 id="datatypes.positive.length"><head>Positive Length</head>
<p>A positive length value not including zero where a 'length' is a real number plus a unit qualification.  <!--(See <specref ref="quantities"/>)-->.</p>
</div3>

<div3 id="datatypes.signed.integer"><head>Signed Integer</head>
<p>A signed integer value which consists of an optional '+' or '-' character followed by a sequence of digits.</p>
</div3>

<div3 id="datatypes.unsigned.integer"><head>Unsigned Integer</head>
<p>An unsigned integer value including zero which consists of a sequence of digits.</p>
</div3>

<div3 id="datatypes.positive.integer"><head>Positive Integer</head>
<p>An unsigned integer value not including zero which consists of a sequence of digits.</p>
</div3>

<div3 id="datatypes.percent"><head>Percent</head>
<p>A percentage which is a signed real value (e.g. 45.5 is 455/1000).</p>
</div3>

<div3 id="datatypes.color"><head>Color</head>
<p>A color specification where '#xxxxxx' is an RGB value encoded in hexidecimal or a named color.</p>
<ednote><edtext>How does other color spaces get encoded?</edtext></ednote>
<ednote><edtext>What set of "named colors" will we use?</edtext></ednote>
</div3>

<div3 id="datatypes.signed.real"><head>Signed Real</head>
<p>A signed real number which consists of an optional '+' or '-' character followed by a sequence of digits followed by an optional '.' character and sequence of digits.</p>
</div3>

<div3 id="datatypes.unsigned.real"><head>Unsigned Real</head>
<p>An unsigned real number including zero which consists of a sequence of digits followed by an optional '.' character and sequence of digits.</p>
</div3>

<div3 id="datatypes.positive.real"><head>Positive Real</head>
<p>An unsigned real number not including zero which consists of a sequence of digits followed by an optional '.' character and sequence of digits.</p>
</div3>

<div3 id="datatypes.space"><head>Space Specifier</head>
<p>A semi-colon separated triplit of lengths specifying the minimum, maximum, and optimal space lengths respectively.</p>
</div3>

<div3 id="datatypes.limit"><head>Limit Specifier</head>
<p>A semi-colon separated pair of lengths specifying the minimum and maximum lengths.</p>
</div3>

<div3 id="datatypes.uri"><head>URI</head>
<p>A sequence of characters conforming to a URI value as specified in the URI specification.</p>
<ednote><edtext>This should refer to the proper specification.</edtext></ednote>
</div3>

<div3 id="datatypes.language"><head>Language</head>
<p>A string of characters conforming to the xml:lang attribute value from XML 1.0</p>
</div3>

<div3 id="datatypes.fontname"><head>Font Name</head>
<p>A string of characters identifying a font.</p>
<ednote><edtext>Shouldn't this have a standardized format?</edtext></ednote>
</div3>

<div3 id="datatypes.fontlist"><head>Font List</head>
<p>A list of font names separated by whitespace.</p>
</div3>

<div3 id="datatypes.enum"><head>Enumeration</head>
<p>A enumerated list of XML NMTOKEN values.</p>
</div3>

<div3 id="datatypes.string"><head>String</head>
<p>A sequence of characters.</p>
</div3>

<!-- Not today
<div3 id="datatypes.pattern"><head>Pattern</head>
<ednote><edtext>TODO:</edtext></ednote>
</div3>
-->

</div2>
<div2 id = "Defterm"><head>Defined Terms</head>
<note>
<p>Coordination between CSS and XSL properties and objects is an
ongoing process, with the goal of defining a common underlying formatting
model. Therefore, some of the object names and definitions, as well
as property names, allowed values, and definitions may change as
a result of this effort.</p></note>
<glist><gitem><label><termdef id = "fm-alignment-point"
    term = "alignment-point"><term>alignment-point</term></termdef></label>
<def><p>This is a the local origin point of an area. It is the point
in the area that is used as the positioning reference for placement
within a parent or for aligning multiple areas.</p></def></gitem>
<gitem><label><termdef id = "fm-allocation-rectangle"
    term = "allocation-rectangle"><term>allocation-rectangle</term></termdef></label>
<def><p>The boundary of the portion of an area which is deemed to
take up room when placing the area inside a larger area.</p></def></gitem>
<gitem><label><termdef id = "fm-area" term = "area"><term>area</term></termdef></label>
<def><p>A "region" is the specification (in a formatting-object)
instructing the formatter on how to create one or more areas. An
"area" is the result of formatting.</p>
<p>(See the "Formatting Model" section of this specification for
more complete descriptions of all types of areas.)</p>
<glist><gitem><label><termdef id = "fm-area-container"
    term = "area-container"><term>area-container</term></termdef></label>
<def><p>Area-containers are the highest level objects in the formatted
result. They specify portions of a page or portions of another area-container.</p>
<p>Area containers are always placed objects. (They have an x-y
coordinate specifying thier placement or they are attached to a
designated edge of a parent area-container.)</p>
<p>Area-containers may set a local coordinate space and always set
a local writing-mode (which inherits to all areas contained in the
container.</p>
<p>(See the "Formatting Model" section of this specification for
more complete descriptions of all types of areas.)</p></def></gitem>
<gitem><label><termdef id = "fm-block-area" term = "block-area"><term>block-area</term></termdef></label>
<def><p>Area-containers contain a set of block-areas. Block areas
are stacked (placed sequentially and adjacent to one another) within
the area-container..</p>
<p>Block-areas are always stacked objects. They are stacked within
the area-container or within another block-area in the direction
specified by the block-progerssion-direction (as derived from the
active writing-mode). The initial edge of one block-area is normally
placed touching the final-edge of the preceding block-area. However,
if space-before/space-after is specified or if the parent object
has a spread or a space-out property, then spae may be inserted
between the block-areas in the stack.</p>
<p>Block-areas may be nested, however, the start-indent and end-indent
of a block is measured from the area-container, not from the parent-block.</p>
<p>Blocks may NOT set a local coordinate space nor set a local writing-mode.</p>
<p>(See the "Formatting Model" section of this specification for
more complete descriptions of all types of areas.)</p></def></gitem>
<gitem><label><termdef id = "fm-line-area" term = "line-area"><term>line-area</term></termdef></label>
<def><p>Line-areas are stacked (placed sequentially and adjacent
to one another) inside block-areas. They are always the full width
of the block-area (except when adjusted by the text-indent and last-line-indent
properties.</p>
<p>Line-areas are always stacked objects. They are stacked within
the block-area in the direction specified by the active line-progression-direction
(as derived from the active writing-mode). The initial edge of one
line-area is normally placed touching the final-edge of the preceding
line-area. However, if line-spacing is specified or if the parent object
has a spread or a space-out property, then space may be inserted
between the line-areas in the stack.</p>
<p>Line-areas are always generated by the formatter (there is no
formatting-object that corresponds directly to a line-area.) Line-areas
may not be nested.</p>
<p>Line-areas may NOT set a local coordinate space nor set a local
writing-mode, however, the direction of inline-progression-direction,
escapement=progression-direction, shift-direction, and up-direction
may change from line-to-line on an algorithmic basis.</p>
<p>(See the "Formatting Model" section of this specification for
more complete descriptions of all types of areas.)</p></def></gitem>
<gitem><label><termdef id = "fm-inline-area" term = "inline-area">
<term>inline-area</term></termdef></label>
<def><p>Inline-areas are stacked (placed sequentially and adjacent
to one another) inside line-areas or inside other inline-areas.</p>
<p>Inline-areas are always stacked objects. They are stacked within
the line-area in the direction specified by the active inline-progression-direction
(as derived from the active writing-mode). The start edge of one
inline-area is normally placed touching the end-edge of the preceding
inline-area. However, if line-spacing is specified or if the parent
object has a justified or a distributed property, then space may
be inserted between the inline-areas in the line.</p>
<p>An inline-area is created for each inline-formatting-object.
Additional line areas may be generated when an inline-area must
be split for line-breaking or hyphenation and may be split for Unicode
bidi support. Inline-areas may be nested.</p>
<p>Inline-areas may NOT set a local coordinate space nor set a local
writing-mode, however, the direction of inline-progression-direction
and escapement-progression-direction may be changed on an algorithmic
basis (for Unicode bidi) or by setting the direction property on
the inline-formatting-object.</p>
<p>Note that ruby, wari-chu, and emphasizing-mark specify the creation
of multiple inline-areas that are placed within a parent inline-area
with a number of specific justapositions. To simplify the formatting-model,
these are treated as special cases.</p>
<p>(See the "Formatting Model" section of this specification for
more complete descriptions of all types of areas.)</p></def></gitem>
<gitem><label><termdef id = "fm-glyph-area" term = "glyph-area"><term>glyph-area</term></termdef></label>
<def><p>Each character (glyph) generates its own inline area.</p>
<p>Glyph-areas are always stacked (placed sequentially and adjacent
to one another) objects. They are stacked within the inline-area
in the direction specified by the active escapement-progression-direction
(as derived from the active writing-mode). The start edge of one
glyph-area is normally placed touching the end-edge of the preceding glyph-area.
However, if letter-spacing or kerning is specified, then space may
be inserted between the glyph-areas.</p>
<p>A glyph-area is created for each glyph (including space glyphs).
Several characters may be merged into a single glyph. (This occurs
when a ligature or a composite accented character can be substituted
for a multi-character sequence. Glyph-areas are the lowest-level
text areas and may not be nested.</p>
<p>(See the "Formatting Model" section of this specification for
more complete descriptions of all types of areas.)</p></def></gitem></glist></def></gitem>
<gitem><label><termdef id = "fm-ascender-height"
    term = "ascender-height"><term>ascender-height</term></termdef></label>
<def><p>The distance from an glyph-area's position point to its
nominally greatest extent in the direction opposite the line-progression
direction. This is a property of the glyph's font as a whole and
not of the individual glyph represented.</p></def></gitem>
<gitem><label><termdef id = "fm-border" term = "border"><term>border</term></termdef></label>
<def><p>A solid open rectangle surrounding an area's content rectangle,
possibly separated by padding.</p></def></gitem>
<gitem><label><termdef id = "fm-conditionality" term = "conditionality">
<term>conditionality</term></termdef></label>
<def><p>A boolean property indication if the display-space should
be suppressed at the if it appears first or last in an area-container.</p></def></gitem>
<gitem><label><termdef id = "fm-content-rectangle"
    term = "content-rectangle"><term>content-rectangle</term></termdef></label>
<def><p>The boundary of the portion of the area in which the content
of the area appears, including the <termref
    def = "fm-allocation-rectangle">allocation-rectangle</termref>s
of smaller areas.</p></def></gitem>
<gitem><label><termdef id = "fm-descender-depth"
    term = "descender-depth"><term>descender-depth</term></termdef></label>
<def><p>The distance from an glyph-area's position point to its
nominally greatest extent in the line-progression direction. This
is a property of the glyph's font as a whole and not of the individual
glyph represented.</p></def></gitem>
<gitem><label>directions and edges</label>
<def><p>XSL uses absolute-direction-specifiers for page layout and
for explicit placement of regions/area-containers.</p>
<p>XSL uses relative-direction-specifiers for all stacked (placed
sequentially and adjacent to one another) areas (block-level and
inline areas).</p>
<p>It also uses consistent and specific definitions for: start,
end, before, after, initial, final, middle, midpoint, center, centered,
justify, justified, distribute, distributed, spread, and space-out.</p>
<glist><gitem><label>Position and alignment specifiers</label>
<def><p>It should be noted that areas may have either absolute position
and alignment specifiers or they may have relative position and
alignment specifiers, but they may not have both.</p>
<glist><gitem><label>absolute position and alignment specifiers</label>
<def><p>These terms are values to properties that specify the position
of one object within another or adjacent to another or the relative
positioning of 2 aligned objects. This set of values are used only
when absolute directions are applicable.</p>
<p>(From CSS, except as noted.)</p>
<glist><gitem><label>In the vertical direction</label>
<def><p>One of the following:</p>
<glist><gitem><label><termdef id = "fm-bottom" term = "bottom"><term>bottom</term></termdef></label>
<def><p> the bottom-edge of </p>
<p>In positions: the bottom edge of an area. </p>
<p>In alignments: the bottommost edge of an area is aligned with
the alignment-point of the referenced object, usually the bottommost
edge of the container.</p>
<p>Used only when absolute directions are applicable.</p></def></gitem>
<gitem><label><termdef id = "fm-middle" term = "middle"><term>middle</term></termdef></label>
<def><p>(CSS uses center, which is ambiguous and must be resolved
based on the context of usage. XSL uses middle to remove this ambiguity.).</p>
<p>In positions: the position halfway between top and bottom. </p>
<p>In alignments: the middle of an area is aligned with the alignment-point of
the referenced object, usually the middle of the container.</p>
<p>Used only when absolute directions are applicable.</p></def></gitem>
<gitem><label><termdef id = "fm-top" term = "top"><term>top</term></termdef></label>
<def><p>In positions: the top edge of an area. </p>
<p>In alignments: the topmost edge of an area is aligned with the
alignment-point of the referenced object, usually the topmost edge
of the container.</p>
<p>Used only when absolute directions are applicable.</p></def></gitem></glist></def></gitem>
<gitem><label>In the horizontal direction</label>
<def><p>One of the following:</p>
<glist><gitem><label><termdef id = "fm-center" term = "center"><term>center</term></termdef></label>
<def><p>In positions: the position halfway between left and right. </p>
<p>In alignments: the center of an area is aligned with the alignment-point of
the referenced object, usually the center of the container.</p>
<p>Used only when absolute directions are applicable.</p>
<p>(Note present tense.)</p></def></gitem>
<gitem><label><termdef id = "fm-distribute" term = "distribute"><term>distribute</term></termdef></label>
<def><p>In positions: this term should not be used. </p>
<p>In alignments: the contents of the area are stretched or spaced
so that it fills the available left-right width, however, additional
space is also inserted at the left-edge and right-edge of the area.</p>
<p>Used only when absolute directions are applicable.</p>
<p>(Note present tense.)</p></def></gitem>
<gitem><label><termdef id = "fm-justify" term = "justify"><term>justify</term></termdef></label>
<def><p>In positions: this term should not be used. </p>
<p>In alignments: the contents of the area are stretched or spaced
so that it fills the available left-right width.</p>
<p>Used only when absolute directions are applicable.</p>
<p>(Note present tense.)</p></def></gitem>
<gitem><label><termdef id = "fm-left" term = "left"><term>left</term></termdef></label>
<def><p>In positions: the left edge of an area. </p>
<p>In alignments: the leftmost edge of an area is aligned with the
alignment-point of the referenced object, usually the leftmost edge
of the container.</p>
<p>Used only when absolute directions are applicable.</p></def></gitem>
<gitem><label><termdef id = "fm-right" term = "right"><term>right</term></termdef></label>
<def><p>In positions: the right edge of an area. </p>
<p>In alignments: the rightmost edge of an area is aligned with
the alignment-point of the referenced object, usually the rightmost
edge of the container.</p>
<p>Used only when absolute directions are applicable.</p></def></gitem></glist></def></gitem></glist></def></gitem></glist>
<glist><gitem><label id = "fm-relative-position">relative position
and alignment specifiers</label>
<def><p>These terms are values to properties that specify the position
of one object within another or adjacent to another or the relative
positioning of 2 aligned objects. This set of values are used only
when relative directions are applicable.</p>
<glist><gitem><label>In the line-progression-direction and the block-progression-direction</label>
<def><p>One of the following:</p>
<glist><gitem><label><termdef id = "fm-after" term = "after"><term>after</term></termdef></label>
<def><p>In positions: The last-edge of an area in the line-/block-progression-direction,
or the space after that edge. (If the writing mode is lr-tb, this would
be the bottom edge).</p>
<p>In alignments: The item is placed outside the area adjacent to
the last-edge (after-edge) of the area.</p>
<p>Used only when relative directions are applicable.</p></def></gitem>
<gitem><label><termdef id = "fm-before" term = "before"><term>before</term></termdef></label>
<def><p>In positions: The first-edge of an area in the line-/block-progression-direction,
or the space before that edge. (If the writing mode is lr-tb, this would
be the top edge).</p>
<p>In alignments: The item is placed outside the area adjacent to
the first-edge (before-edge) of the area.</p>
<p>Used only when relative directions are applicable.</p></def></gitem>
<gitem><label><termdef id = "fm-final" term = "final"><term>final</term></termdef></label>
<def><p>In positions: The last position (closest to the after-edge)
that an area can be placed within its parent container.</p>
<p>In alignments: The object's alignment-point of the referenced
object is aligned with the alignment-point of the referenced object
(usually the baseline) of the last item placed within the area.</p>
<p>Used only when relative directions are applicable.</p></def></gitem>
<gitem><label><termdef id = "fm-initial" term = "initial"><term>initial</term></termdef></label>
<def><p>In positions: The first position (closest to the before-edge)
that an area can be placed within its parent container.</p>
<p>In alignments: The object's alignment-point of the referenced
object is aligned with the alignment-point of the referenced object
(usually the baseline) of the first item placed within the area.</p>
<p>Used only when relative directions are applicable.</p></def></gitem>
<gitem><label><termdef id = "fm-midpoint" term = "midpoint"><term>midpoint</term></termdef></label>
<def><p>In positions: the position halfway between before-edge and
after-edge. </p>
<p>In alignments: the center of an area is aligned with the alignment-point of
the referenced object, usually the center of the container.</p>
<p>Used only when relative directions are applicable.</p>
<p>(Note midpoint vs. middle.)</p></def></gitem>
<gitem><label><termdef id = "fm-spaced-out" term = "spaced-out"><term>spaced-out</term></termdef></label>
<def><p>In positions: this term should not be used. </p>
<p>In alignments: the contents of the area are stretched or spaced
so that it fills the available initial-final height, however, additional
space is also inserted at the initial-edge and final-edge of the
area.</p>
<p>Used only when relative directions are applicable.</p>
<p>(Note past tense.)</p></def></gitem>
<gitem><label><termdef id = "fm-spread" term = "spread"><term>spread</term></termdef></label>
<def><p>In positions: this term should not be used. </p>
<p>In alignments: the contents of the area are stretched or spaced
so that it fills the available initial-final height.</p>
<p>Used only when relative directions are applicable.</p>
<p>(Note past tense.)</p></def></gitem></glist></def></gitem>
<gitem><label>In the escapemant-progression-direction and the inline-progression-direction</label>
<def><p>One of the following:</p>
<glist><gitem><label><termdef id = "fm-centered" term = "centered">
<term>centered</term></termdef></label>
<def><p>In positions: the position halfway between start and end. </p>
<p>In alignments: the centered point of an area is aligned with
the alignment-point of the referenced object, usually the centered
point of the container.</p>
<p>Used only when relative directions are applicable.</p>
<p>(Note past tense.)</p></def></gitem>
<gitem><label><termdef id = "fm-end" term = "end"><term>end</term></termdef></label>
<def><p>In positions: the edge of an area closest to the end edge
indicated by the first term of the writing-mode that applies to
the area. (If the writing mode is lr-tb, this would be the right
edge). </p>
<p>In alignments: the end edge of an area is aligned with the alignment-point of
the referenced object, usually the end edge of the container.</p>
<p>Used only when relative directions are applicable.</p></def></gitem>
<gitem><label><termdef id = "fm-distributed" term = "distributed">
<term>distributed</term></termdef></label>
<def><p>In positions: this term should not be used. </p>
<p>In alignments: the contents of the area are stretched or spaced
so that it fills the available start-end width, however, additional
space is also inserted at the start-edge and end-edge of the area.</p>
<p>Used only when relative directions are applicable.</p>
<p>(Note past tense.)</p></def></gitem>
<gitem><label><termdef id = "fm-start" term = "start"><term>start</term></termdef></label>
<def><p>In positions: the edge of an area closest to the start edge
indicated by the first term of the writing-mode that applies to
the area. (If the writing mode is lr-tb, this would be the left
edge). </p>
<p>In alignments: the start edge of an area is aligned with the
alignment-point of the referenced object, usually the start edge
of the container.</p>
<p>Used only when relative directions are applicable.</p></def></gitem>
<gitem><label><termdef id = "fm-justified" term = "justified"><term>justified</term></termdef></label>
<def><p>In positions: this term should not be used. </p>
<p>In alignments: the contents of the area are stretched or spaced
so that it fills the available start-end width.</p>
<p>Used only when relative directions are applicable.</p>
<p>(Note past tense.)</p></def></gitem></glist></def></gitem></glist></def></gitem></glist></def></gitem>
<gitem><label><termdef id = "fm-direction" term = "direction"><term>direction</term></termdef></label>
<def><p>The term "direction" should be qualified as described in
the following list. All relative positions and progressions in XSL
are specified in terms of one or more of these direction specifiers.</p>
<p>The "writing-mode" property is used to set these values as a
set.</p>
<p>For some formatting objects, the "direction" property can override
one of these (or the subset of the direction specifiers that would
be parallel -- for example, it may set both the block-progression-direction
and the line-progression-direction or override both the inline-progression-direction
and the escapement-progression-direction).</p>
<glist><gitem><label><termdef id = "fm-block-progression-direction"
    term = "block-progression-direction"><term>block-progression-direction</term></termdef></label>
<def><p>The direction of progression of sequential block-level area
placements as specified by the last term of the writing-mode. (If
the writing-mode is lr-tb, the block-progression-direction is top-to-bottom.)</p>
<p>Always perpendicular to the inline-progression-direction.</p></def></gitem>
<gitem><label><termdef id = "fm-column-progression-direction"
    term = "column-progression-direction"><term>column-progression-direction</term></termdef></label>
<def><p>The direction of progression of sequential column area placements
as specified by the first term of the writing-mode. (If the writing-mode
is lr-tb, the column-progression-direction is left-to-right.)</p>
<p>For writing modes that have alternating or inverting first terms,
this direction does not reverse.</p></def></gitem>
<gitem><label><termdef id = "fm-escapement-progression-direction"
    term = "escapement-progression-direction"><term>escapement-progression-direction</term></termdef></label>
<def><p>The direction of progression of sequential glyph area placements
along the placement-path as specified by the character/glyph information.
May be overridden by the direction property. May be the same as
or the reverse of the inline-progression-direction. (If the writing-mode
is lr-tb, the escapement-progression-direction is left-to-right.)</p>
<p>If unspecified, use the inline-progression-direction specified
by the first term of the writing-mode.</p>
<p>For writing modes that have alternating or inverting first terms,
this direction reverses accordingly.</p></def></gitem>
<gitem><label><termdef id = "fm-inline-progression-direction"
    term = "inline-progression-direction"><term>inline-progression-direction</term></termdef></label>
<def><p>The direction of progression of sequential inline areas as
specified by the first term of the writing-mode. (If the writing-mode
is lr-tb, the inline-progression-direction is left-to-right.)</p>
<p>Usually the same direction as the escapement direction.</p>
<p>Perpendicular to the block-progression direction and the line-progression direction.</p>
<p>For writing modes that have alternating or inverting first terms,
this direction reverses accordingly.</p></def></gitem>
<gitem><label><termdef id = "fm-line-progression-direction"
    term = "line-progression-direction"><term>line-progression-direction</term></termdef></label>
<def><p>Perpendicular to the inline-progression-direction, the direction
of successive textline placements as specified by the last term
of the writing-mode. (If the writing-mode is lr-tb, the line-progression-direction
is top-to-bottom.)</p>
<p>Usually the same as the block-progression-direction.</p></def></gitem>
<gitem><label><termdef id = "fm-row-progression-direction"
    term = "row-progression-direction"><term>row-progression-direction</term></termdef></label>
<def><p>The direction of progression of sequential row area placements
as specified by the last term of the writing-mode. (If the writing-mode is
lr-tb, the row-progression-direction is top-to-bottom.)</p></def></gitem>
<gitem><label><termdef id = "fm-shift-direction"
    term = "shift-direction"><term>shift-direction</term></termdef></label>
<def><p>The direction of positive shift when characters, inline
areas, or scores are shifted perpendicular to the placement-path.
Usually the reverse of the line-progression-direction. (If the writing-mode
is lr-tb, the shift-direction is bottom-to-top.)</p>
<p>For writing modes that have inverting first terms, this direction
reverses accordingly.</p></def></gitem>
<gitem><label><termdef id = "fm-up-direction" term = "up-direction">
<term>up-direction</term></termdef></label>
<def><p>The direction of the characterÕs up-vector.</p>
<p>For mixed-width-non-joining text, this is usually the same as
the shift-direction.</p>
<p>For vertically-written ideographic text, the up-vector is the
reverse of the first-term of the writing-mode. (If the writing mode
is tb-lr, the up-vector is bottom-to-top.)</p>
<p>For roman text in vertically-written ideographic text, the up-vector
is specified by the vertical-roman-orientation property. (If the
writing-mode is tb-lr: and vertical-roman-orientation=vertical then
the up-direction for roman text is bottom-to-top, however, if the
vertical-roman-orientation=perpendicular then the up-direction for
roman-text is right-to-left.)</p></def></gitem></glist></def></gitem>
<gitem><label>edge</label>
<def><p>The term "edge" specifies each of the sides of any area,
based on writing-mode. "Edge" should be qualified as follows:</p>
<glist><gitem><label><termdef id = "fm-after-edge" term = "after-edge">
<term>after-edge</term></termdef></label>
<def><p>The area following the current area in the direction specified
by the last term of the writing mode. (Also the edge of the current
area toward the area following the current area in the direction
specified by the last term of the writing mode.)</p></def></gitem>
<gitem><label><termdef id = "fm-final-edge" term = "final-edge"><term>final-edge</term></termdef></label>
<def><p>The edge of the current area toward the area following the
current area in the direction specified by the last term of the
writing mode.</p></def></gitem>
<gitem><label><termdef id = "fm-before-edge" term = "before-edge">
<term>before-edge</term></termdef></label>
<def><p>The area prior to the current area in the direction specified
by the last term of the writing mode. (Also the edge of the current
area toward the area prior to the current area in the direction
specified by the last term of the writing mode.)</p></def></gitem>
<gitem><label><termdef id = "fm-initial-edge" term = "initial-edge">
<term>initial-edge</term></termdef></label>
<def><p>The edge of the current area toward the area prior to the
current area in the direction specified by the last term of the
writing mode.</p></def></gitem>
<gitem><label><termdef id = "fm-end-edge" term = "end-edge"><term>end-edge</term></termdef></label>
<def><p>The area following the current area in the direction specified
by the first term of the writing mode. (Also the edge of the current
area toward the area following the current area in the direction
specified by the first term of the writing mode.)</p>
<p>For writing modes that have alternating or inverting first terms,
this direction reverses accordingly.</p></def></gitem>
<gitem><label><termdef id = "fm-start-edge" term = "start-edge"><term>start-edge</term></termdef></label>
<def><p>The area prior to the current area in the direction specified
by the first term of the writing mode. (Also the edge of the current
area toward the area prior to the current area in the direction
specified by the first term of the writing mode.)</p>
<p>For writing modes that have alternating or inverting first terms,
this direction reverses accordingly.</p></def></gitem></glist></def></gitem></glist></def></gitem>
<gitem><label><termdef id = "fm-escapement-point"
    term = "escapement-point"><term>escapement-point</term></termdef></label>
<def><p>A designated point of an inline-area which, when the area
is placed, is used in determining the containing line-area's new
placement-point. It is always on the edge opposite the position-point.</p></def></gitem>
<gitem><label><termdef id = "fm-escapement-vector"
    term = "escapement-vector"><term>escapement-vector</term></termdef></label>
<def><p>The vector from the placement-point of an inline-area to
its escapement-point.</p></def></gitem>
<gitem><label><termdef id = "fm-line" term = "line"><term>line</term></termdef></label>
<def><p>Since we have many kinds of lines, the term will be qualified
as follows:</p>
<glist><gitem><label><termdef id = "fm-graphic-line"
    term = "graphic-line"><term>graphic-line</term></termdef></label>
<def><p>A graphic representation of a line-segment. Used for rules
and scores (underscore, overscore, and strike-through).</p></def></gitem>
<gitem><label><termdef id = "fm-textline" term = "textline"><term>textline</term></termdef></label>
<def><p>A sequence of characters (and spaces) arranged along or
relative to a common baseline.</p></def></gitem></glist></def></gitem>
<gitem><label><termdef id = "fm-margin" term = "margin"><term>margin</term></termdef></label>
<def><p>We have not resolved all differences between CSS's use of
the term margin and XSL's use of the terms display-space or inline-space.
The term margin is used for page-margins and cell-margins. It is
left as a placeholder in a number of other locations until all the
details of the difference between the 2 models can be full resolved.</p></def></gitem>
<gitem><label><termdef id = "fm-maximum-line-rectangle"
    term = "maximum-line-rectangle"><term>maximum-line-rectangle</term></termdef></label>
<def><p>The rectangle associated with a line area which is as wide
as the content rectangle in the inline-progression direction, and
which in the perpendicular direction stretches from the maximum <termref
    def = "fm-ascender-height">ascender-height</termref> to the
maximum <termref def = "fm-descender-depth">descender-depth</termref> for
the actual fonts and <termref def = "fm-inline-area">inline-area</termref>s
placed on the line, as raised and lowered by <code role = "attrname">vertical-align</code> and
other adjustments perpendicular to the<termref
    def = "fm-inline-progression-direction"> inline-progression-direction</termref>.
Used for placing the line when minimum-leading is in effect.</p></def></gitem>
<gitem><label><termdef id = "fm-nominal-font" term = "nominal-font">
<term>nominal-font</term></termdef></label>
<def><p>The default font associated with an area. This consists
of a fully qualified nominal-font name and font size.</p></def></gitem>
<gitem><label><termdef id = "fm-nominal-glyph-height"
    term = "nominal-glyph-height"><term>nominal-glyph-height</term></termdef></label>
<def><p>The height from the descender-depth to the ascender-height
of  the default font associated with this line-area or inline-area
area.</p></def></gitem>
<gitem><label><termdef id = "fm-nominal-requested-line-rectangle"
    term = "nominal-requested-line-rectangle"><term>nominal-requested-line-rectangle</term></termdef></label>
<def><p>The rectangle associated with a line area which is as wide as
the content rectangle in the inline-progression direction, and which
in the perpendicular direction stretches from the <termref
    def = "fm-ascender-height">ascender-height</termref> to the <termref
    def = "fm-descender-depth">descender-depth</termref> of the
nominal-font. Used for placing the line when minimum-leading is
in effect.</p></def></gitem>
<gitem><label><termdef id = "fm-offset" term = "offset"><term>offset</term></termdef></label>
<def><p>A fixed height/width adjustment that occurs between 2 objects
within an area.</p>
<p>In the absence of futher qualification in the property definition,
if this adjustment is positive, the offset object will be displaced
in the shift-direction by the distance specified.</p>
<p>Similarly, if this adjustment is negative, the offset object
will be displaced in the reverse of shift-direction by the distance
specified.</p>
<p>(See also: "space" and "separation".)</p></def></gitem>
<gitem><label><termdef id = "fm-padding" term = "padding"><term>padding</term></termdef></label>
<def><p>The open space between an area's content rectangle and its
border.</p></def></gitem>
<gitem><label><termdef id = "fm-page-model" term = "page-model"><term>page-model</term></termdef></label>
<def><p>Page designs can follow several models:</p>
<glist><gitem><label><termdef id = "fm-sequential-tiled-page-model"
    term = "sequential-tiled-page-model"><term>sequential-tiled-page-model</term></termdef></label>
<def><p>This is your typical word processor page.</p>
<p>The subareas do not overlap. They are full width and are separated
from the preceding subarea by a separation distance measured from
the preceding area in the block-progression-direction specified
by the writing-mode of the page.</p></def></gitem>
<gitem><label><termdef id = "fm-interlocking-tiled-page-model"
    term = "interlocking-tiled-page-model"><term>interlocking-tiled-page-model</term></termdef></label>
<def><p>This is your typical newspaper page. </p>
<p>The subareas do not overlap. Pages consist of rectangular, T,
inverted-L shaped areas. They are non-overlapping and touch the
adjacent areas (or page margins) on all sides.</p></def></gitem>
<gitem><label><termdef id = "fm-simple-freeform-page-model"
    term = "simple-freeform-page-model"><term>simple-freeform-page-model</term></termdef></label>
<def><p>The origins of the subareas are specified as X-Y coordinates
measured from the page origin. Each area then specifies its shape
relative to that origin. If areas overlap, they are overlapped in
the order that the areas are specified (or in accordance with a <code
    role = "attrname">z-order</code> property), hiding the information
of the underlying area.</p></def></gitem>
<gitem><label><termdef id = "fm-exclusionary-freeform-page-model"
    term = "exclusionary-freeform-page-model"><term>exclusionary-freeform-page-model</term></termdef></label>
<def><p>The origins of the subareas are specified as X-Y coordinates
measured from the page origin. Each area then specifies its shape
relative to that origin. If areas overlap, they are overlapped in
the order that the areas are specified (or in accordance with a <code
    role = "attrname">z-order</code> property), reshaping the underlying
area to wrap around the current area.</p></def></gitem></glist></def></gitem>
<gitem><label><termdef id = "fm-placement-path" term = "placement-path">
<term>placement-path</term></termdef></label>
<def><p>A progression of items placed adjacently in the inline-progression-direction for
inline areas or the block-progression-direction for block-level
areas.</p></def></gitem>
<gitem><label><termdef id = "fm-placement-point"
    term = "placement-point"><term>placement-point</term></termdef></label>
<def><p>During the filling of a line-area, the point at which the
next inline-area will be placed.</p></def></gitem>
<gitem><label><termdef id = "fm-position-point" term = "position-point">
<term>position-point</term></termdef></label>
<def><p>A designated point on one edge of an inline-area, which
is used to align inline-areas along a common placement-path.</p></def></gitem>
<gitem><label><termdef id = "fm-precedence" term = "precedence"><term>precedence</term></termdef></label>
<def><p>An indication of the importance of one value over another.
Display-space and inline-space values with greater precedence take
effect over those with lower precedence.</p></def></gitem>
<gitem><label><termdef id = "fm-property" term = "property"><term>property</term></termdef></label>
<def><p>An attribute of a formatting-object.</p></def></gitem>
<gitem><label><termdef id = "fm-region" term = "region"><term>region</term></termdef></label>
<def><p>The specification, in a formatting object, directing/controlling
the creation of an area. (Specifically an area-container.)</p></def></gitem>
<gitem><label><termdef id = "fm-qualifier" term = "qualifier"><term>qualifier</term></termdef></label>
<def><p>An attribute of a character. Usually derived through system-dependent
font metric and classification services.</p></def></gitem>
<gitem><label><termdef id = "fm-queue" term = "queue"><term>queue</term></termdef></label>
<def><p>(This was "port" in the DSSSL specification.)</p></def></gitem>
<gitem><label><termdef id = "fm-separation" term = "separation"><term>separation</term></termdef></label>
<def><p>A fixed height/width adjustment that occurs between 2 areas.</p>
<p>If this adjustment is positive, the 2 areas will be separated
by the resultant distance.</p>
<p>If this adjustment is negative, the 2 areas will overlap by the
resultant distance.</p>
<p>(See also: "space" and "offset".)</p></def></gitem>
<gitem><label><termdef id = "fm-space" term = "space"><term>space</term></termdef></label>
<def><p>A variable height/width adjustment that occurs between 2
areas.</p>
<p>If this adjustment is positive, the 2 areas will be separated
by the resultant distance.</p>
<p>If this adjustment is negative, the 2 areas will overlap by the
resultant distance.</p>
<p>(See also: "separation" and "offset".)</p>
<glist><gitem><label><termdef id = "fm-conditional-space"
    term = "conditional-space"><term>conditional-space</term></termdef></label>
<def><p>A display-space or inline-space with conditionality = true.</p></def></gitem>
<gitem><label><termdef id = "fm-display-space" term = "display-space">
<term>display-space</term></termdef></label>
<def><p>Space used between line areas or block areas.</p></def></gitem>
<gitem><label><termdef id = "fm-inline-space" term = "inline-space">
<term>inline-space</term></termdef></label>
<def><p>Space used between areas within a line area.</p></def></gitem>
<gitem><label><termdef id = "fm-space-character"
    term = "space-character"><term>space-character</term></termdef></label>
<def><p>The character at codepoint 0x20 (ascii-space).</p></def></gitem></glist></def></gitem>
<gitem><label><termdef id = "fm-space-resolution-rules"
    term = "space-resolution-rules"><term>space-resolution-rules</term></termdef></label>
<def><p>The rules used to resolve how several adjacent display spaces
or inline spaces are combined into a single display space or inline
space.</p></def></gitem></glist></div2>
</div1>

</body>
<back>
<div1>
<head>DTD for XSL Stylesheets</head>

<p>The following entity can be used to construct a DTD for XSL
stylesheets that create instances of a particular result DTD.  Before
referencing the entity, the stylesheet DTD must define a
<code>result-elements</code> parameter entity listing the allowed
result element types.  For example:</p>

<eg><![CDATA[<!ENTITY % result-elements "
  | fo:inline-sequence
  | fo:block
">]]></eg>

<eg><![CDATA[<!ENTITY % instructions "
  | xsl:apply-templates
  | xsl:apply-imports
  | xsl:for-each
  | xsl:value-of
  | xsl:number
  | xsl:counter
  | xsl:counters
  | xsl:counter-increment
  | xsl:counter-reset
  | xsl:counter-scope
  | xsl:choose
  | xsl:if
  | xsl:contents
  | xsl:invoke
  | xsl:text
  | xsl:pi
  | xsl:comment
  | xsl:element
  | xsl:attribute
  | xsl:use
  | xsl:copy
">

<!ENTITY % template "
 (#PCDATA
  %instructions;
  %result-elements;)*
">

<!ENTITY % space-att "xml:space (default|preserve) #IMPLIED">
 
<!ELEMENT xsl:stylesheet
 (xsl:import*,
  (xsl:include
  | xsl:id
  | xsl:strip-space
  | xsl:preserve-space
  | xsl:macro
  | xsl:attribute-set
  | xsl:constant
  | xsl:template)*)
>

<!ATTLIST xsl:stylesheet
  result-ns NMTOKEN #IMPLIED
  default-space (preserve|strip) "preserve"
  indent-result (yes|no) "no"
  id ID #IMPLIED
  xmlns:xsl CDATA #FIXED "http://www.w3.org/TR/WD-xsl"
  %space-att;
>

<!-- Used for attribute values that are URIs.-->
<!ENTITY % URI "CDATA">

<!-- Used for attribute values that are patterns.-->
<!ENTITY % pattern "CDATA">

<!-- Used for attribute values that are a priority. -->
<!ENTITY % priority "NMTOKEN">

<!ELEMENT xsl:import EMPTY>
<!ATTLIST xsl:import href %URI; #REQUIRED>

<!ELEMENT xsl:include EMPTY>
<!ATTLIST xsl:include href %URI; #REQUIRED>

<!ELEMENT xsl:id EMPTY>
<!ATTLIST xsl:id
  attribute NMTOKEN #REQUIRED
  element NMTOKEN #IMPLIED
>

<!ELEMENT xsl:strip-space EMPTY>
<!ATTLIST xsl:strip-space element NMTOKEN #REQUIRED>

<!ELEMENT xsl:preserve-space EMPTY>
<!ATTLIST xsl:preserve-space element NMTOKEN #REQUIRED>

<!ELEMENT xsl:template %template;>
<!ATTLIST xsl:template
  match %pattern; #REQUIRED
  priority %priority; #IMPLIED
  mode NMTOKEN #IMPLIED
  %space-att;
>

<!ELEMENT xsl:value-of EMPTY>
<!ATTLIST xsl:value-of select CDATA #IMPLIED>

<!ENTITY % conversion-atts '
   format CDATA "1"
   xml:lang NMTOKEN #IMPLIED
   letter-value (alphabetic|other) #IMPLIED
   digit-group-sep CDATA #IMPLIED
   n-digits-per-group NMTOKEN #IMPLIED
   sequence-src %URI; #IMPLIED
'>

<!ELEMENT xsl:number EMPTY>
<!ATTLIST xsl:number
   level (single|multi|any) "single"
   count CDATA #IMPLIED
   from CDATA #IMPLIED
   %conversion-atts;
>

<!ELEMENT xsl:counter EMPTY>
<!ATTLIST xsl:counter
  name NMTOKEN #REQUIRED
  %conversion-atts;
>

<!ELEMENT xsl:counters EMPTY>
<!ATTLIST xsl:counters
  name NMTOKEN #REQUIRED
  %conversion-atts;
>

<!ELEMENT xsl:counter-increment EMPTY>
<!ATTLIST xsl:counter-increment
  name NMTOKEN #REQUIRED
  amount NMTOKEN #IMPLIED
>

<!ELEMENT xsl:counter-reset EMPTY>
<!ATTLIST xsl:counter-reset
  name NMTOKEN #REQUIRED
  value NMTOKEN #IMPLIED
>

<!ELEMENT xsl:counter-scope %template;>
<!ATTLIST xsl:counter-scope %space-att;>

<!ELEMENT xsl:apply-templates (xsl:sort*)>
<!ATTLIST xsl:apply-templates
  select %pattern; #IMPLIED
  mode NMTOKEN #IMPLIED
>

<!ELEMENT xsl:apply-imports EMPTY>

<!-- xsl:sort cannot occur after any other elements or
any non-whitespace character -->

<!ELEMENT xsl:for-each
 (#PCDATA
  %instructions;
  %result-elements;
  | xsl:sort)*
>

<!ATTLIST xsl:for-each
  select %pattern; #REQUIRED
  %space-att;
>

<!ELEMENT xsl:sort EMPTY>
<!ATTLIST xsl:sort
  select %pattern; "."
  lang CDATA #IMPLIED
  data-type (text|number) "text"
  order (ascending|descending) "ascending"
  case-order (upper-first|lower-first) #IMPLIED
>

<!ELEMENT xsl:if %template;>
<!ATTLIST xsl:if
  test %pattern; #REQUIRED
  %space-att;
>

<!ELEMENT xsl:choose (xsl:when+, xsl:otherwise?)>
<!ATTLIST xsl:choose %space-att;>

<!ELEMENT xsl:when %template;>
<!ATTLIST xsl:when
  test %pattern; #REQUIRED
  %space-att;
>

<!ELEMENT xsl:otherwise %template;>
<!ATTLIST xsl:otherwise %space-att;>

<!ELEMENT xsl:attribute-set (xsl:attribute|xsl:use)*>
<!ATTLIST xsl:attribute-set
  name NMTOKEN #REQUIRED
>

<!ELEMENT xsl:constant EMPTY>
<!ATTLIST xsl:constant 
  name NMTOKEN #REQUIRED
  value CDATA #REQUIRED
>

<!-- xsl:macro-arg cannot occur after any other elements or
any non-whitespace character -->

<!ELEMENT xsl:macro
 (#PCDATA
  %instructions;
  %result-elements;
  | xsl:macro-arg)*
>

<!ATTLIST xsl:macro
  name NMTOKEN #REQUIRED
  %space-att;
>

<!ELEMENT xsl:macro-arg EMPTY>
<!ATTLIST xsl:macro-arg
  name NMTOKEN #REQUIRED
  default CDATA #IMPLIED
>

<!-- This is allowed only within xsl:macro -->
<!ELEMENT xsl:contents EMPTY>

<!-- xsl:arg cannot occur after any other elements or
any non-whitespace character -->

<!ELEMENT xsl:invoke
 (#PCDATA
  %instructions;
  %result-elements;
  | xsl:arg)*
>

<!ATTLIST xsl:invoke
  macro NMTOKEN #REQUIRED
  %space-att;
>

<!ELEMENT xsl:arg EMPTY>
<!ATTLIST xsl:arg
  name NMTOKEN #REQUIRED
  value CDATA #REQUIRED
>

<!ELEMENT xsl:text (#PCDATA)>
<!ATTLIST xsl:text %space-att;>

<!ELEMENT xsl:pi %template;>
<!ATTLIST xsl:pi 
  name CDATA #REQUIRED
  %space-att;
>

<!ELEMENT xsl:element %template;>
<!ATTLIST xsl:element 
  name CDATA #REQUIRED
  %space-att;
>

<!ELEMENT xsl:attribute %template;>
<!ATTLIST xsl:attribute 
  name CDATA #REQUIRED
  %space-att;
>

<!ELEMENT xsl:use EMPTY>
<!ATTRIBUTE xsl:use attribute-set NMTOKEN #REQUIRED>

<!ELEMENT xsl:comment %template;>
<!ATTLIST xsl:comment %space-att;>

<!ELEMENT xsl:copy %template;>
<!ATTLIST xsl:copy %space-att;>

]]></eg>
</div1>

<div1>
<head>References</head>
<div2>
<head>Normative References</head>
<blist>

<bibl id="XML" key="W3C XML">World Wide Web Consortium. <emph>Extensible
Markup Language (XML) 1.0.</emph> W3C Recommendation. See <loc
href="http://www.w3.org/TR/1998/REC-xml-19980210">http://www.w3.org/TR/1998/REC-xml-19980210</loc></bibl>

<bibl id="XMLNAMES" key="W3C XML Names">World Wide Web
Consortium. <emph>Namespaces in XML.</emph> W3C Working Draft. See
<loc
href="http://www.w3.org/TR/WD-xml-names">http://www.w3.org/TR/WD-xml-names</loc></bibl>

</blist>
</div2>
<div2>
<head>Other References</head>

<blist>

<bibl id="CSS2" key="CSS2">World Wide Web Consortium.  <emph>Cascading
Style Sheets, level 2 (CSS2)</emph>.  W3C Recommendation.  See <loc
href="http://www.w3.org/TR/1998/REC-CSS2-19980512"
>http://www.w3.org/TR/1998/REC-CSS2-19980512</loc></bibl>

<bibl id="DSSSL" key="DSSSL">International Organization
for Standardization, International Electrotechnical Commission.
<emph>ISO/IEC 10179:1996.  Document Style Semantics and Specification
Language (DSSSL)</emph>.  International Standard.</bibl>

<bibl id="UNICODE-TR10" key="UNICODE TR10">Unicode Consortium.  <emph>Draft
Unicode Technical Report #10. Unicode Collation Algorithm</emph>.
Draft Unicode Technical Report.  See <loc
href="http://www.unicode.org/unicode/reports/tr10/index.html"
>http://www.unicode.org/unicode/reports/tr10/index.html</loc>.</bibl>

<bibl id="XMLSTYLE" key="W3C XML Stylesheet">World Wide Web
Consortium. <emph>Associating stylesheets with XML documents.</emph>
W3C Working Draft. See <loc
href="http://www.w3.org/TR/WD-xml-stylesheet">http://www.w3.org/TR/WD-xml-stylesheet</loc></bibl>

</blist>

</div2>
</div1>
<inform-div1>
<head>Examples</head>
<p>The following is a simple but complete stylesheet.</p>

<eg><![CDATA[<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"
                xmlns:fo="http://www.w3.org/TR/WD-xsl/FO"
                result-ns="fo"
                indent-result="yes">
<xsl:template match='/'>
 <fo:basic-page-sequence font-family="serif">
  <fo:simple-page-master page-master-name='scrolling'/>
  <fo:queue queue-name='body'>
   <xsl:apply-templates/>
  </fo:queue>
 </fo:basic-page-sequence>
</xsl:template>

<xsl:template match="title">
 <fo:block font-weight="bold">
  <xsl:apply-templates/>
 </fo:block>
</xsl:template>

<xsl:template match="p">
 <fo:block>
  <xsl:apply-templates/>
 </fo:block>
</xsl:template>

<xsl:template match="emph">
 <fo:inline-sequence font-style="italic">
  <xsl:apply-templates/>
 </fo:inline-sequence>
</xsl:template>

</xsl:stylesheet>]]></eg>

<p>With the following source document</p>

<eg><![CDATA[<doc>
<title>An example</title>
<p>This is a test.</p>
<p>This is <emph>another</emph> test.</p>
</doc>]]></eg>

<p>it would produce the following result</p>

<eg><![CDATA[<fo:basic-page-sequence xmlns:fo="http://www.w3.org/TR/WD-xsl/FO"
  font-family="serif">
<fo:simple-page-master page-master-name="scrolling"/>
<fo:queue queue-name="body">
<fo:block font-weight="bold">An example</fo:block>
<fo:block>This is a test.</fo:block>
<fo:block>This is <fo:inline-sequence
  font-style="italic">another</fo:inline-sequence> test.</fo:block>
</fo:queue>
</fo:basic-page-sequence>]]></eg>

</inform-div1>

<inform-div1>
<head>Design Principles</head>

<p>In the design of any language, trade-offs in the solution space are
necessary.  To aid in making these trade-offs the follow design
principles were used:</p>

<slist>
<sitem>XSL should support browsing, printing, and interactive editing and
design tools</sitem>
<sitem>XSL should be capable of specifying presentations for traditional and
Web environments</sitem>
<sitem>XSL should support interaction with structured information, as well
as presentation of it.</sitem>
<sitem>XSL should support all kinds of structured information, including both
data and documents.</sitem>
<sitem>XSL should support both visual and non-visual presentations.</sitem>
<sitem>XSL should be a declarative language.</sitem>
<sitem>XSL should be optimized to provide simple specifications for common
formatting tasks and not preclude more sophisticated formatting tasks.</sitem>
<sitem>XSL should provide an extensibility mechanism</sitem>
<sitem>The number of optional features in XSL should be kept to a minimum.</sitem>
<sitem>XSL should provide the formatting functionality of <emph>at
least</emph> DSSSL and CSS</sitem>
<sitem>XSL should leverage other recommendations and standards.</sitem>
<sitem>XSL should be expressed in XML syntax.</sitem>
<sitem>XSL stylesheets should be human-readable and reasonably clear.</sitem>
<sitem>Terseness in XSL markup is of minimal importance.</sitem>
</slist>
</inform-div1>
<inform-div1>
<head>Acknowledgements</head>
<p>The following have contributed to authoring this draft:</p>
<slist>
<sitem>Sharon Adler, Inso Corporation</sitem>
<sitem>Anders Berglund, Inso Corporation</sitem>
<sitem>Jeff Caruso, Bitstream (Formatting Model, Defined Terms)</sitem>
<sitem>Paul Grosso, ArborText</sitem>
<sitem>Eduardo Gutentag, Sun Microsystems</sitem>
<sitem>Chris Lilley, W3C</sitem>
<sitem>Chris Maden, O'Reilly &amp; Associates</sitem>
<sitem>Jonathan Marsh, Microsoft Corporation</sitem>
<sitem>Alex Milowski, Veo Systems (formatting objects and properties database)</sitem> 
<sitem>Henry S. Thompson, University of Edinburgh</sitem>
<sitem>Paul Trevithick, Bitstream</sitem>
<sitem>Norman Walsh, ArborText</sitem>
<sitem>Steve Zilles, Adobe</sitem>
</slist>
</inform-div1>
<inform-div1>
<head>Changes from Previous Public Working Draft</head>

<p>The following is a summary of changes in the Tree Construction part
since the previous public working draft.</p>

<p><code>xsl:process</code> and <code>xsl:process-children</code> have
been combined into <code>xsl:apply-templates.</code></p>

<p>The <code>expr</code> attribute of <code>xsl:value-of</code> has
been renamed to <code>select</code>.</p>

<p>Support for comments has been added.</p>

<p>Support for processing instructions has been added.</p>

<p>Support for text nodes has been added.</p>

<p>Support for result tree numbering has been added.</p>

<p>Support for sorting has been added.</p>

<p>The <code>xsl:copy</code> element has been added.</p>

<p>The <code>xsl:element</code> element has been added.</p>

<p>The <code>xsl:attribute</code> element has been added.</p>

<p>Attribute patterns have been changed: the syntax is
<code>@foo</code> rather than <code>attribute(foo)</code>; they can be
used as match patterns and select patterns; <code>@*</code> can be
used to match all attributes.</p>

<p>The argument to id() must now be quoted. Select patterns can also
be used as an argument.</p>

<p>The syntax for patterns has been reworked; it is now more general
than before.</p>

<p>The syntax for quoting namespaces has been changed.</p>

<p>Specificity has been removed.</p>

<p>Priorities can be real numbers.</p>

<p>Support for processing modes has been added.</p>

<p><code>xsl:apply-imports</code> has been added.</p>

<p><code>define-</code> has been removed from the name of top-level
elements.  <code>xsl:attribute-set</code> now contains
<code>xsl:attribute</code> elements.</p>

<p>The <code>xsl:use</code> attribute has been replaced by an
<code>xsl:use</code> element.</p>

<p>The default namespace (as declared with the <code>xmlns</code>
attribute) is not used for element type names in patterns.</p>

<p>The <code>ancestor-or-self</code> function has been added.</p>

</inform-div1>
</back>
</spec>
