LimSee3 Document Model v1.3

Jan Mikáč Cécile Roisin Romain Deltour

About this Document

The purpose of this document is to provide a developer-friendly description of the LimSee3 document model. It was first sketched in [DocEng2006] and [TelCoPs2006]. Since then, several refactoring cycles has been performed. This document is now in its version 1.3.

  1. About this Document
  2. LimSee3 Document Structure
    1. Namespaces in LimSee3 Documents
    2. Document Element
    3. Document Metainformation
      1. Head Element
      2. Meta Element
    4. Objects
      1. Object Element
      2. Related Object Elements
      3. Layout Elements
      4. Timing Elements
    5. Child Elements and Content Templates
      1. Children Element
      2. Invites
      3. Models
        1. Place-holders
        2. Complex models
  3. Common Definitions
    1. Common Attributes
    2. Local Identifiers
    3. Referenced Identifiers
    4. Basic Media Types
    5. Locking Attribute
    6. Alignment Attribute
  4. LimSee3 DTD
    1. Main DTD Document
    2. Expanded SMIL Definitions
      1. Layout elements (region)
      2. Layout entities (attribute sets)
      3. Timing elements (seq, par, excl)
      4. Timing entities (attribute sets)

  5. References

LimSee3 Document Structure

A LimSee3 document is a well-formed and valid XML document. The root element of the whole structure is document. The DTD structure described in this reference is publicly accessible at http://ns.inria.fr/limsee3/limsee3.dtd.

Namespaces in LimSee3 Documents

LimSee3 documents combine elements (and attributes) from different domains. Since these domains are semantically well separated, the LimSee3 document model attributes a different namespace (and a name-prefix) for each of them:

  1. The plain document structure describes the hierarchy of media objects. This hierarchy represents the core structure, so that its namespace is the default one. However, to prevent possible future namespace conflicts, we define also the limsee3 prefix for that namespace:
    <!ENTITY % ns.limsee3 "
       xmlns          CDATA  #FIXED 'http://ns.inria.fr/limsee3'
       xmlns:limsee3  CDATA  #FIXED 'http://ns.inria.fr/limsee3'
    ">
  2. The templates describe constraints on the document object hierarchy. LimSee3 templates are prefixed with template and are defined in the following namespace:
    <!ENTITY % ns.templates " xmlns:template  CDATA  #FIXED  'http://ns.inria.fr/limsee3/template' " >
  3. Elements and attributes imported from SMIL are prefixed with smil and are taken from the language version 2.1:
    <!ENTITY % ns.smil " xmlns:smil  CDATA  #FIXED  'http://www.w3.org/2005/SMIL21/CR' " >
  4. Elements and attributes imported from core XML are prefixed with the reserved xml prefix and are bound to the reserved XML namespace:
    <!ENTITY % ns.xml " xmlns:xml   CDATA  #FIXED  'http://www.w3.org/XML/1998/namespace' ">
  5. Elements and attributes imported from XSLT are prefixed with xsl:
    <!ENTITY % ns.xslt " xmlns:xsl  CDATA  #FIXED  'http://www.w3.org/1999/XSL/Transform' " >

    The namespace we use does not preclude of the actual version of XSLT, since both XSLT 1.0 and 2.0 share the above namespace. We consider it as a future-proofing advantage.

Document Element

The unique document element plays the role of a wrapper for the document head and body. Neither the head or the body is required, in order to allow free creation of all kind of (template) documents. However, each document has at most one head and one top-most object standing for the body. This restriction is aimed at facilitating document content extraction/insertion, as well as maintaining the uniqueness of local identifiers (see local identifiers).

As a root element, document is an ideal place for declaring the different namespaces. In doing so, all descendants automatically inherit these namespace declarations.

<!ELEMENT document (head?, object?)>
<!ATTLIST document
 %common.attr;
 %lock; 
 %ns.limsee3;
 %ns.templates;
 %ns.smil;
 %ns.xml;
 %ns.xslt;
>

We enable the locking of the whole document. Even if it might not be very useful in practice, we believe it provides a uniform "any-part-of-the-document-may-be-locked-out" approach.

Document Metainformation

This subsection deals with the document heading, which contains meta-data about the document. This metainformation is defined through two elements: head and meta.

Document head is a collection of meta-information enclosed in a head. Currently, no special meta-information is required to be present in the head section of a document.

Meta Element

Any piece of meta-information is described by a meta element. These are very classical ones, directly inspired from standard definitions (e.g XHTML): meta elements are empty, each defining a couple of mandatory attributes, which describe a (meta-)property name and value. Examples of sensible properties that can be described using meta elements can be found e.g. in the Dublin Core.

<!ELEMENT meta EMPTY >
<!ATTLIST meta
  name    CDATA #REQUIRED
  content CDATA #REQUIRED
  %lock;
  %common.attr;
>

We could probably put a further restriction on the type of the name attribute, as the whole CDATA type seems too permissive. For instance, the NAME type defined in HTML could be used.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE document SYSTEM "http://limsee3.gforge.inria.fr/dtd/limsee3.dtd">
<document xmlns="http://wam.inrialpes.fr/software/limsee3"
          xmlns:limsee3="http://wam.inrialpes.fr/software/limsee3"          
          xmlns:smil="http://www.w3.org/2005/SMIL21/Language"
          xmlns:template="http://wam.inrialpes.fr/software/limsee3/template"
          xmlns:smil="http://www.w3.org/2005/SMIL21/Language"
          xmlns:xml="http://www.w3.org/XML/1998/namespace"
          xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
  <head>
    <meta name="author" content="Jan Mikac"/>
    <meta name="keywords" content="document model, 3rd version" xml:lang="en" />
    <meta content="creationDate" name="2006-11-14" lock="locked" />
    <meta content="lastModification" name="2006-11-14" />
  </head> 
</document>

Example of a complete document with a header but no body

Objects

This subsection is devoted to the structure of (standalone) objects. We define the object element itself, then we describe its related, timing and layout parts. Its embedded children are treated separately, in the following subsection.

Object Element

Objects represent semantic units formed by

The interpretation of object elements is not easy, since they are designed to describe a large variety of logical presentation units, which can be

<!ELEMENT object (related?, children?, timing?, layout?, text?) >
<!ATTLIST object
  %common.attr;
  %id.local; 
  type  (complex | %media.type; | area)  #IMPLIED
  template:types     CDATA               #IMPLIED
  template:refModel  CDATA               #IMPLIED
  src                CDATA               #IMPLIED
  %lock;
>
<object type="video" src="medias/movie.avi" />

Example of a simple media object (video)

The following two objects are semantically equivalent, provided that the src attribute in the first of them points to a resource of the same content as the text child in the second one:

<object type="text" src="medias/example_description.html" />
<object type="text">
  <text>This is an example of an <em>embedded</em> text.</text>
</object>

Example of two text objects

To present the concept of area objects, we consider an audio object (a sequence of "jingles"). We sub-divide this object into two parts by the means of two area objects.

The timing section will be introduced later, so let us simply say that this section allows to specify the time-related behavior of an object in the scope of its parent. Hence the following piece of code states that the audio object defines two distinguished parts:

In other words, we define a first jingle which corresponds to the first three seconds of the audio sequence and a second jingle which consists of the following two seconds.

<object type="audio" src="medias/jingles.mp3">
  <children>
    <object type="area" localId="jingle1">
      <timing begin="0s" end="3s" />
    </object>
    <object type="area" localId="jingle2">
      <timing begin="3s" end="5s" />
    </object>
  </children>
</object>

Example of area objects

An object declares in the related section all references to external objects.

An external reference ref is a mapping between a symbolic name (localId) and the URI of the related element (refId).

<!ELEMENT ref EMPTY >
<!ATTLIST ref
  %id.local.name;  CDATA  #REQUIRED
  %id.ref;
  %lock;
>

The symbolic name is designed to be used inside the object as a surrogate for the actual reference to some outside entity. All external references, that is references to other than direct child objects, should be declared in the related section and addressed solely through their symbolic names. This approach is designed to promoting object reuse by making dependencies to other objects explicit.

Layout Elements

The layout section of an object describes the spatial layout of this object and its descendants within the space region assigned to it by its parent. The enclosing layout element is defined as follows:

<!ELEMENT layout (smil:region | layoutRef | regPoint)* >
<!ATTLIST layout  
  %SMIL.common-layout-attrs;  
  %SMIL.region-attrs;
  %lock;
  regPoint  CDATA  #IMPLIED
  %regAlign.attr;
>

The layout element has a set of attributes taken from the SMIL 2.1 Language profile. These attributes manage the spatial position of the object within its enclosing parent. For more details (and an expanded list of attributes) consult the corresponding part of the extensive DTD below.

The layout element can contain any number of regions, layout references and registration point definitions. The region element is reused from SMIL 2.1 Language profile: hence the smil: prefix. However, we slightly modify the definition of smil:region, so that regions in LimSee3 can contain layout references. The detailed mechanism is described in the DTD, so let us simply give the result here:

<!ELEMENT smil:region (smil:region | layoutRef | regPoint)* >
<!ATTLIST smil:region
  -- as in SMIL 2.1 Language Profile
>

A layout reference represents a link between a (smil) region and a child object.

<!ELEMENT layoutRef EMPTY >
<!ATTLIST layoutRef  
  region  CDATA  #IMPLIED  
  id.ref;
  %lock;
>

A registration point defines a specific named point within a (bounding) box. The registration point can be used to align objects on it.

<!ELEMENT regPoint EMPTY >
<!ATTLIST regPoint
  name    CDATA  #REQUIRED
  top     CDATA  'auto'
  left    CDATA  'auto'
  right   CDATA  'auto'
  bottom  CDATA  'auto'
  %regAlign.attr;
>

The semantic model of the layout section follows the model of regions in SMIL 2.1. A layout or a smil:region defines an implicit (or explicit) "box" inside of which all embedded regions and layouts will be rendered. Child regions (and layouts) are interpreted relatively to the parent settings. We propose several examples to illustrate the idea.

In the following, the outermost object is the body of a LimSee3 document. As such, its layout plays the role of the presentation window. Hence the presentation window will be 500 pixels wide and 300 pixels high. Since the layout section does not define any sub-regions, the child object ("Image1") will be rendered in its parent region, that is in the 500x300 rectangle described by layout, at the default (upper left) corner. We consider that by default, the image is resized to best fit the attributed region (which corresponds to the SMIL attribute fill="meet").

<document ...>
  <object localId="presentationBody" type="complex">
    <children>
      <object localId="Image1" type="image" src="medias/img1.jpg" />
    </children>
    <layout width="500" height="300" />
  </object>
</document>

image inserted in the default layout

The same layout could be achieved by explicitly assigning the default layout to the Image1 child:

<document ...>
  <object localId="presentationBody" type="complex">
    <children>
      <object localId="Image1" type="image" src="medias/img1.jpg" />
    </children>
    <layout width="500" height="300">
      <layoutRef refId="Image1" />
    </layout>
  </object>
</document>

Simple case of child object positioning

Here we further develop the above example. Our purpose is to render the img1.jpg image 200 pixels away from the left border of the englobing window. There are at least two ways to achieve it.

The first possibility is that the embedded Image1 object declares its own layout section, in which it specifies that it should be rendered with a 200-pixel translation to the left. This translation is interpreted relatively to the region assigned to Image1 by its parent, which is in this case, the 500x300 rectangle.

<document ...>
  <object localId="presentationBody" type="complex">
    <children>
      <object localId="Image1" type="image" src="medias/img1.jpg">
        <layout left="200" />
      </object>
    </children>
    <layout width="500" height="300" />
  </object>
</document>

case 1 - the embedded object modifies its relative left position

The second possibility is to declare a sub-region R1 in the parent object and to assign Image1 to that sub-region. If the default, upper-left corner of R1 is situated 200 pixels to the left from the border of the 500x300 rectangle, the embedded image will be rendered at the desired place.

<document ...>
  <object localId="presentationBody" type="complex">
    <children>
      <object localId="Image1" type="image" src="medias/img1.jpg" />
    </children>
    <layout width="500" height="300">
      <smil:region regionName="R1" left="200" height="300" width="300" />
      <layoutRef   region="R1"     refId="Image1" />
    </layout>
  </object>
</document>

case 2 - a subregion is declared

Equivalently, we could have embedded the layoutRef element into the corresponding smil:region, in which case the region attribute would become unnecessary:

...
<smil:region regionName="R1" left="200" height="300" width="300">
  <layoutRef refId="Image1" />
</smil:region>
...

The two ways of element positioning - (1) by property on the element or (2) by parent-assigned sub-region - are not exclusive. They can be freely combined, in which case their action is additive, as in this example:

<document ...>
  <object localId="anotherParent" type="complex">
    <children>
      <object localId="Image1" type="image" src="medias/img1.jpg">
        <layout left="200" />
      </object>
    </children>
    <layout width="500" height="300">
      <smil:region regionName="R1" left="120" height="300" width="300" />
      <layoutRef   region="R1"     refId="Image1" />
    </layout>
  </object>
</document>

case 3 - parent and embedded object translate to the left

Yet choosing one way of element positioning or the other (or a combination of both) is not neutral. In case of reuse, all proper settings of an object are reused as well. This means that if we reuse (copy & paste) the 200-pixel-offset image from our first case, it will be rendered 200 pixels to the left, in any parent container we put it into.

The choice of either delegating settings to child objects or fixing it from the parent will be even more important with templates, because of possible multiple instantiation of a model.

Example of sub-region positioning

Timing Elements

The timing section of an object describes the temporal layout of this object and its descendants within the time container assigned to it by its parent. The enclosing timing element is defined as follows:

<!ELEMENT timing (smil:seq | smil:par | smil:excl | timingRef)* >
<!ATTLIST timing
  %SMIL.endsync.attrib;
  %SMIL.fill.attrib;
  %SMIL.timecontainer.attrib;
  %SMIL.Test.attrib;
  %SMIL.customTestAttr.attrib;
  %SMIL.skip-content.attrib;
  %lock;
>

The timing element has a set of attributes taken from the SMIL 2.1 Language profile. These attributes manage the various time-related properties of the object within the time-container assigned by the enclosing parent. For more details (and an expanded list of attributes) consult the corresponding part of the extensive DTD below.

The timing element can contain any number of sequential, parallel or exclusive time containers, and timing references. The seq, par and excl elements are reused from SMIL 2.1 Language profile: hence the smil: prefix. However, we slightly modify their definitions, so that they can contain timing references as well. The detailed mechanism is given in the DTD, so let us simply give the result here:

<!ELEMENT smil:seq (smil:par | smil:seq | smil:excl | 
                    smil:switch | smil:prefetch | smil:a | 
                    timingRef)* >
<!ATTLIST smil:seq
  -- as in SMIL 2.1 Language Profile
>

<!ELEMENT smil:par (smil:par | smil:seq | smil:excl | 
                    smil:switch | smil:prefetch | smil:a | 
                    timingRef)* >
<!ATTLIST smil:par
  -- as in SMIL 2.1 Language Profile
>

<!ELEMENT smil:excl ((smil:par | smil:seq | smil:excl | 
                      smil:switch | smil:prefetch | smil:a | 
                      timingRef)* 
                    | smil:priorityClass+) >
<!ATTLIST smil:excl
  -- as in SMIL 2.1 Language Profile
>

We modified the definitions of seq, par and excl in the following way: we allowed timingRef as a child, and we forbade all medias (video, audio, ref,...). Now we can wonder if the switch, prefetch and a elements should be kept or not.

A timing reference represents a link between a time container and a child object: a timeRef element assigns the referenced object to the immediately englobing time container.

<!ELEMENT timingRef EMPTY >
<!ATTLIST timingRef
  %id.ref;
  %lock;
>

The semantic model of the timing section follows the model of time in SMIL 2.1 (see for instance the Timing and Synchronization module description). A timing or a smil:seq, smil:par, smil:excl define an implicit (or explicit) time container for objects that are assigned to them by the means of timingRef. Child time containers are interpreted relatively to the parent settings. If an object is not assigned to any time container via a timingRef, it is by default included into its parent's timing.

The timing and layout sections are as symmetric as possible and rely on the same mechanism which interprets child settings relatively to the parent ones. This is why we will use the same support for examples as in the layout section above and unsurprisingly, we will get symmetric results in the time dimension.

In the following, we consider the time behavior of our first layout example:

<document ...>
  <object localId="presentationBody" type="complex">
    <children>
      <object localId="Image1" type="image" src="medias/img1.jpg" />
    </children>
    <layout width="500" height="300" />
  </object>
</document>

As the embedded object Image1 is a still image, according to the SMIL semantics, its intrinsic duration is 0. Since no other explicit or implicit duration setting is done, the whole presentation has an intrinsic and active duration time 0. This is not much... To remedy to the situation, we begin by explicitly assigning a non-zero duration to the image: five seconds.

<document ...>
  <object localId="presentationBody" type="complex">
    <children>
      <object localId="Image1" type="image" src="medias/img1.jpg">
        <timing dur="5s" />
      </object>
    </children>
    <layout width="500" height="300" />
  </object>
</document>

Now, the whole presentation displays the image for 5 seconds and then ends. One can wonder what happens if the englobing presentationBody object assigns Image1 to a time container with an explicit duration. For instance, a seq container with only 4 second long life-time:

<document ...>
  <object localId="presentationBody" type="complex">
    <children>
      <object localId="Image1" type="image" src="medias/img1.jpg">
        <timing dur="5s" />
      </object>
    </children>
    <timing>
      <smil:seq dur="4s">
        <timingRef refId="Image1" />
      </smil:seq>
    </timing>
    <layout width="500" height="300" />
  </object>
</document>

In such a case, as Image1 is interpreted relatively to its parent-assigned container, the whole presentation lasts only 4 seconds.

4 second long presentation

Conversely, if the parent object decides to define a longer duration (8 seconds), the whole presentation will last that 8 seconds. During the first five seconds, the Image1 image will be displayed because of its explicit duration. What happens afterwards depends on the behavior of the image after its active duration period: in this example, we ask the image to be removed, so that in the last three seconds, the presentation window will be empty.

<document ...>
  <object localId="presentationBody" type="complex">
    <children>
      <object localId="Image1" type="image" src="medias/img1.jpg">
        <timing dur="5s" fill="remove" />
      </object>
    </children>
    <timing>
      <smil:seq dur="8s">
        <timingRef refId="Image1" />
      </smil:seq>
    </timing>
    <layout width="500" height="300" />
  </object>
</document>

8 second presentation with 5 second image

Our next step is to add a new text object into the presentation as a sibling of Image1. This text will simply state "The end" and will last as long as its parent container does (thanks to the fill="hold" specification, which overrides the intrinsic zero duration of a text). Since Image1 and Text share the same time container (defined in their common parent) and since this container is a sequential one, the objects will appear one after another: five seconds of image, then three seconds of text.

<document ...>
  <object localId="presentationBody" type="complex">
    <children>
      <object localId="Image1" type="image" src="medias/img1.jpg">
        <timing dur="5s" fill="remove" />
      </object>
      <object localId="Text" type="text" src="medias/end.txt">
        <timing fill="hold" />
      </object>
    </children>
    <timing>
      <smil:seq dur="8s">
        <timingRef refId="Image1" />
        <timingRef refId="Text" />
      </smil:seq>
    </timing>
    <layout width="500" height="300" />
  </object>
</document>

sequential image and text

Finally, what would happen if we put the two objects in a parallel time container instead? The image would still be displayed as before (first five seconds on the screen, then removed), yet the text would be displayed in parallel with the image, during the whole active periode of the par.

<document ...>
  <object localId="presentationBody" type="complex">
    <children>
      <object localId="Image1" type="image" src="medias/img1.jpg">
        <timing dur="5s" fill="remove" />
      </object>
      <object localId="Text" type="text" src="medias/end.txt">
        <timing fill="hold" />
      </object>
    </children>
    <timing>
      <smil:par dur="8s">
        <timingRef refId="Image1" />
        <timingRef refId="Text" />
      </smil:par>
    </timing>
    <layout width="500" height="300" />
  </object>
</document>

image and text in parallel

Example of durations

In this example, we intend to illustrate the main difference between our timing model and the SMIL one: in SMIL, the temporal tree is given explicitly, while in LimSee3 it is contained implicitly in the objects. In fact, the LimSee3 timing tree is distributed through the object hierarchy. To create an explicit time-container tree, the whole hierarchy of objects has to be visited.

The following code features a slide with an animation effect. The slide contains a title and two items to be displayed: item1 and item2, each of them lasting five seconds. The items are enclosed in an object (item-list) which specifies that their common time container is a seq. The title and item-list are on their turn enclosed in the top-mostslide object that assigns them into a par container.

<object type="complex" localId="slide">
  <children>
    <object type="text" localId="title" src="txt/title.txt" />
    <object type="complex" localId="item-list">
      <children>
        <object type="text" localId="item1" src="txt/item1.txt">
          <timing dur="5s" />
        </object>
        <object type="text" localId="item2" src="txt/item2.txt">
          <timing dur="5s" />
        </object>
      </children>
      <timing>
        <smil:seq>
          <timingRef refId="item1" />
          <timingRef refId="item2" />
        </smil:seq>
      </timing>
    </object>
  </children>
  <timing>
    <smil:par>
      <timingRef refId="title" />
      <timingRef refId="item-list" />
    </smil:par>
  </timing>
</object>

The expected behavior is: title and item-list are displayed in parallel, the items in the list are displayed sequentially. As a result, during the first five seconds the title should be displayed along with the first item, then during the next five seconds, there should be the title and the second item.

timeline: 5s of title and item1, 5s of title and item2

We can calculate the SMIL explicit time-container tree which is equivalent to our object hierarchy:

SMIL time tree: par containing title and seq, containing item1 and item2

Example of complex time tree

Child Objects and Models

Since a LimSee3 document allows models to be defined and instantiated, the child elements of an object have to be able to describe templates, instances and all intermediary steps. This subsection presents the elements involved in this role: children, model, invite.

Children Element

Our document model is designed to support a progressive authoring process with possible backtracking. That is, following actions and states have to be expressible:

This is why we define the children element in the following way, mixing objects with models and invites to describe them. In this way is ensured a continuum between pure models and pure instances.

<!ELEMENT children (object | template:model | template:invite)* >

Invites

Invites are used for documenting or explaining a model. Typically, an invite will be present to guide the user to instantiate a model. Invites may be of any media type, specified in the type attribute. The invite contents are either given directly as a child of the invite element, or indirectly, by specifying the source (src).

<!ELEMENT template:invite (#PCDATA) >
<!ATTLIST template:invite
  type (%media.type;) #REQUIRED 
  src  CDATA          #IMPLIED
  %lock;
  %common.attr;
>

Models

  1. There are two kinds of models. The first of them is rather simple, since it can only describe one place-holder for one basic media resource. This kind of model is expressed by an under-specified object, that is an object with no value in its src attribute, and some value in its template:types attribute. The template:types attribute contains a semicolon(;)-separated list of basic media types (see media.type): this list is interpreted as the list of acceptable types for that object.

    We chose semicolon to separate media types in template:types to be consistent with SMIL attributes.

    As a model, such an under-specified object can naturally contain some template:invite elements. A place-holder object must not set a value for the type attribute.

    Here is an example of a media place-holder model. This model can receive either an image or a text. (Note the absence of src.)

    <object localId="leftButton" template:types="image ; text" />

    We could be more user-friendly by providing some invites so that the user know what kind of information (s)he should drop into the place-holder to instantiate it:

    <object localId="leftButton" template:types="image ; text">
      <children>
        <template:invite type="text" xml:lang="en">
          Put here an image or a short piece of text that 
          describes navigation to the left.
        </template:invite>
        <template:invite type="text" xml:lang="fr">
          Mettez ici une image ou une courte description textuelle
          pour décrire le déplacement vers la gauche.
        </template:invite>
      </children>
    </object>

    Of course, the model can specify any other object information: for instance a part of the layout (the background color).

    <object localId="leftButton" template:types="image ; text">
      <children>
        <template:invite type="text" xml:lang="en">
          Put here an image or a short piece of text that 
          describes navigation to the left.
        </template:invite>
        <template:invite type="text" xml:lang="fr">
          Mettez ici une image ou une courte description textuelle
          pour décrire le déplacement vers la gauche.
        </template:invite>
      </children>
      <layout backgroundColor="grey" />
    </object>

    When this model is instantiated, for example with an image, the src attribute is set and the type attribute reflects the actual type.

    <object localId="leftButton" template:types="image ; text"
     src="medias/leftArrow.png" type="image" >
      <children>
        <template:invite type="text" xml:lang="en">
          Put here an image or a short piece of text that 
          describes navigation to the left.
        </template:invite>
        <template:invite type="text" xml:lang="fr">
          Mettez ici une image ou une courte description textuelle
          pour décrire le déplacement vers la gauche.
        </template:invite>
      </children>
      <layout backgroundColor="grey" />
    </object>

    Example of a simple media place-holder model and its instantiation

  2. The second kind of models is the more general one. It is described by an arbitrarily complex object embedded into a template:model element. A template:model element describes a model that can be instantiated more than once. The actual number of instances of a model required (or allowed) in a document is specified by the min and max attributes, giving respectively the minimal and maximal number of instances.

    A model must declare its name. This allows instance objects to keep trace of the model that was used to create them. To this purpose, object elements put their model name into the template:refModel attribute.

    <!ELEMENT template:model (object) >
    <!ATTLIST template:model
      %lock; 
      min   CDATA  #IMPLIED
      max   CDATA  #IMPLIED
      name  CDATA  #REQUIRED
    >

    Our first example of a template:model is purposedly very close to the place-holder example above. In fact, we simply embed the previous place-holder object into a model:

    <template:model name="authorPortraits" min="1" max="4">
      <object template:types="image ; text" type="image" />
    </template:model>

    Since it would have little sense to create up to 4 "left" buttons, let us suppose in this example that the model proposes to insert the portraits of the authors into a document. In most cases, an image would be given, yet there is a possibility to provide a textual alternative, e.g. an ASCII-art portrait.

    Let us suppose the existence of a parent object:

    <object localId="authors">
      <children>
        <template:model name="authorPortraits" min="1" max="4">
          <object template:types="image ; text" type="image" />
        </template:model>
      </children>
    </object>

    Now, what happens if the model is instantiated with the img/john.png image? Basically, the model contents are copied into a new sibling node and then instantiated (notice the src and modelRef attributes):

    <object localId="authors">
      <children>
        <template:model name="authorPortraits" min="1" max="4">
          <object template:types="image ; text" type="image" />
        </template:model>
        <object template:types="image ; text" type="image"
         src="img/john.png" modelRef="authorPortraits" />
      </children>
    </object>

    A second instantiation brings a second sibling node:

    <object localId="authors">
      <children>
        <template:model name="authorPortraits" min="1" max="4">
          <object template:types="image ; text" type="image" />
        </template:model>
        <object template:types="image ; text" type="image"
         src="img/john.png" modelRef="authorPortraits" />
        <object template:types="image ; text" type="image"
         src="img/betty.png" modelRef="authorPortraits" />
      </children>
    </object>

    Example of a simple template:model node

    The previous example shows that template:model nodes can be used instead of mere place-holders, perhaps with more flexibility when multiple instances are considered. Yet the true power of template:model elements resides in their ability to embed an arbitrarily complex object, not just a plain media one.

    In the following, we propose a model for a HTML-like list item, formed by some text preceded by a bullet. The bullet is the same for all list items - it is simply a fixed image of a bullet. The item text is to be provided by the user, so it is represented by a text place-holder. These two elements are embedded into a composite object that takes care of positioning the bullet and the text relatively to one another. The whole constitutes the body of our template:model element which describes one list item.

    <template:model name="list-item" min="1" >
      <object type="complex" localId="item">
        <children>
          <object type="image" src="img/red-bullet.png" localId="item-bullet">
            <layout fit="meet" />
          </object>
          <object template:types="text" localId="item-text">
            <children>
              <template:invite type="text">Type in the item text</template:invite>
            </children>
          </object>
        </children>
        <layout>
          <smil:region left="0" top="14" width="32" height="32">
            <layoutRef refId="item-bullet" />
          </smil:region>
          <smil:region left="40" top="0" width="350" height="60">
            <layoutRef refId="item-text" />
          </smil:region>
        </layout>
      </object>
    </template:model>

    Now the above list-item model can become on its turn a part of a more complex model. For instance, a slide (in a slide show) can be seen as an object with a title and some number of list items below it.

    <template:model name="slide">
      <object type="complex" localId="aSlide">
        <children>
          <object template:types="text" localId="title" />
          <template:model name="list-item" min="1" >
            <object type="complex" localId="item">
              <children>
                <object type="image" src="img/red-bullet.png" localId="item-bullet">
                  <layout fit="meet" />
                </object>
                <object template:types="text" localId="item-text">
                  <children>
                    <template:invite type="text">Type in the item text</template:invite>
                  </children>
                </object>
              </children>
              <layout>
                <smil:region left="0" top="14" width="32" height="32">
                  <layoutRef refId="item-bullet" />
                </smil:region>
                <smil:region left="40" top="0" width="350" height="60">
                  <layoutRef refId="item-text" />
                </smil:region>
              </layout>
            </object>
          </template:model>
        </children>
      </object>
    </template:model>

    Of course, the aSlide object could contain its own timing and layout sections, so to make the model even more sophisticated.

    Example of a complex template:model node

If we compare the place-holders discussed in first subsection and the models presented in the second, three major differences can be pointed out:

Beyond these differences, place-holders and models share a common property: when instantiated, they receive additional information, but no previously known information is lost:

Of course, the same mechanism can be used for other purposes than undoing instantiation: for example, if a model is modified, we can track all its instances and re-validate them against the new model.

Common Definitions

This section deals with some common/transversal aspects of the LimSee3 document model.

Common Attributes

We define here a set of attributes that seem useful enough to be included in every LimSee3 element:

<!ENTITY % common.attr " xml:lang  CDATA  #IMPLIED " >

Local Identifiers

Most document body elements may declare a localId attribute. This attribute is described by:

<!ENTITY % id.local.name "localId"                           >
<!ENTITY % id.local      "%id.local.name;   CDATA   #IMPLIED" >

The value of of the localId attribute should not contain the character dot ('.') for reasons that are exposed in the sequel.

As its name implies, a localId is a local identifier: it is locally unique, that is, given an element E, within the scope of its direct parent P, the value of the localId attribute of E is unique. In other words, if in some parent element P any two siblings declare local identifiers, then their localIds have to be different.

Since localId allows to uniquely identify an element within its parent context, there exists a canonical way of creating globally unique identifiers (of the XML type ID). For this, gather all localIds of all ascendants of some element E (including E) in a dot-separated list. The corresponding string is a global identifier of E, provided that all ascendants have declared valid localIds (namely without dots).

Referenced Identifiers

Some elements define references to local ids. These references are most commonly stored in refId attributes.

<!ENTITY % id.ref.name "refId"                          >
<!ENTITY % id.ref      "%id.ref.name;  CDATA  #REQUIRED">

Basic Media Types

Currently, the LimSee3 format allows inclusion of media assets of the following types: image, text, audio, video and animation. This list may be extended in the future.

<!ENTITY % media.type " image | audio | video | text | animation " >

Locking Attribute

In order to protect parts of a document, a locking attribute is defined:

<!ENTITY % lock  "locked  (locked|unlocked)  #IMPLIED" >

When a document element is locked, this element (and its successors) cannot be edited. This mechanism can be used for instance to guide inexperienced users by restricting their access to some parts of the document, or to prevent changes in a copyright notice etc. By default an element is considered as not locked, unless the locked="locked" attribute is explicitly declared.

Alignment Attribute

This attribute is copied from SMIL. Its purpose is to provide alignement information for objects:

<!ENTITY % regAlign.attr "regAlign (topLeft | topMid | topRight | midLeft | center |
                                    midRight | bottomLeft | bottomMid | bottomRight) #IMPLIED " >


LimSee3 DTD

This section provides a DTD which reflects all the above settings and comments.

Main DTD Document

This is the main DTD driver, located at http://ns.inria.fr/limsee3/limsee3.dtd.

<!-- ============================================================================================  -->
<!--  Here we import parts of SMIL 2.1 (language profile) =======================================  -->
<!--  for reuse in our elements.                          =======================================  -->
<!--  The imported elements will be prefixed with 'smil:' =======================================  -->
<!--  and will live in the following namespace:           =======================================  -->
<!--   http://www.w3.org/2005/SMIL21/Language             =======================================  -->
<!-- ============================================================================================  -->
  <!-- Defining the prefix -->
  <!ENTITY % NS.prefixed "INCLUDE" >
  <!ENTITY % SMIL.prefix "smil" >

  <!-- Defining the SMIL Content Model:

       We use a slightly modified SMIL Language Profile:
       first, we import all Language Profile definitions
       an then we modify some of them prior to their use
       in the Modular Framework Module.

   -->
   <!-- (1) import the Language Profile -->
   <!ENTITY % smil-model.mod
             PUBLIC "-//W3C//ENTITIES SMIL 2.1 Document Model 1.0//EN"
             "http://www.w3.org/2005/SMIL21/smil-language-profile-model-1.mod" >

    <!-- (2.1) make changes to the definition of the smil:region element -->
    <!ENTITY % SMIL.region.content "( smil:region | layoutRef )* ">

    <!-- (2.2) make changes to the definition of smil:par, smil:seq and smil:excl elements -->
    <!ENTITY % SMIL.timecontainer.content "smil:par | smil:seq | smil:excl
                                     | smil:switch | smil:prefetch | smil:a
                                     | timingRef">

    <!-- (2.3) make changes to the definition of the fit attribute (suppress the prefix) -->
    <!--<!ENTITY % SMIL.fit.attrib "
       fit            (hidden|fill|meet|meetBest|scroll|slice)   #IMPLIED
    ">-->

    <!-- (2.4) removes the (2.3) modification and replaces it with the general mechanism
          that removes all "smil:" prefixing from imported elements and attributes, except
          those listed below.
    -->

    <!ENTITY % SMIL.pfx "" >
    <!ENTITY % SMIL.animate.qname "smil:animate" >
    <!ENTITY % SMIL.set.qname "smil:set" >
    <!ENTITY % SMIL.animateMotion.qname "smil:animateMotion" >
    <!ENTITY % SMIL.animateColor.qname "smil:animateColor" >
    <!ENTITY % SMIL.switch.qname "smil:switch" >
    <!ENTITY % SMIL.customTest.qname "smil:customTest" >
    <!ENTITY % SMIL.customAttributes.qname "smil:customAttributes" >
    <!ENTITY % SMIL.prefetch.qname "smil:prefetch" >
    <!ENTITY % SMIL.layout.qname "smil:layout" >
    <!ENTITY % SMIL.region.qname "smil:region" >
    <!ENTITY % SMIL.root-layout.qname "smil:root-layout" >
    <!ENTITY % SMIL.topLayout.qname "smil:topLayout" >
    <!ENTITY % SMIL.regPoint.qname "smil:regPoint" >
    <!ENTITY % SMIL.a.qname "smil:a" >
    <!ENTITY % SMIL.area.qname "smil:area" >
    <!ENTITY % SMIL.anchor.qname "smil:anchor" >
    <!ENTITY % SMIL.ref.qname "smil:ref" >
    <!ENTITY % SMIL.audio.qname "smil:audio" >
    <!ENTITY % SMIL.img.qname "smil:img" >
    <!ENTITY % SMIL.video.qname "smil:video" >
    <!ENTITY % SMIL.text.qname "smil:text" >
    <!ENTITY % SMIL.textstream.qname "smil:textstream" >
    <!ENTITY % SMIL.animation.qname "smil:animation" >
    <!ENTITY % SMIL.param.qname "smil:param" >
    <!ENTITY % SMIL.paramGroup.qname "smil:paramGroup" >
    <!ENTITY % SMIL.brush.qname "smil:brush" >
    <!ENTITY % SMIL.meta.qname "smil:meta" >
    <!ENTITY % SMIL.metadata.qname "smil:metadata" >
    <!ENTITY % SMIL.smil.qname "smil:smil" >
    <!ENTITY % SMIL.head.qname "smil:head" >
    <!ENTITY % SMIL.body.qname "smil:body" >
    <!ENTITY % SMIL.seq.qname "smil:seq" >
    <!ENTITY % SMIL.par.qname "smil:par" >
    <!ENTITY % SMIL.excl.qname "smil:excl" >
    <!ENTITY % SMIL.priorityClass.qname   "smil:priorityClass">
    <!ENTITY % SMIL.transition.qname "smil:transition" >
    <!ENTITY % SMIL.transitionFilter.qname "smil:transitionFilter" >

  <!-- Making use of the SMIL Modular Framework Module -->
  <!ENTITY % smil-framework.module "INCLUDE" >
  <![%smil-framework.module;[
    <!ENTITY % smil-framework.mod
      PUBLIC "-//W3C//ENTITIES SMIL 2.1 Modular Framework 1.0//EN"
             "http://www.w3.org/2005/SMIL21/smil-framework-1.mod" >
  %smil-framework.mod;]]>

  <!-- Importing the SMIL Layout Module into our DTD -->
  <!ENTITY % SMIL.layout-mod  PUBLIC "-//W3C//ELEMENTS SMIL 2.1 Layout//EN"
    "http://www.w3.org/2005/SMIL21/SMIL-layout.mod">
  %SMIL.layout-mod;

  <!-- Importing the SMIL Timing Module into our DTD -->
  <!ENTITY % SMIL.timing-mod PUBLIC "-//W3C//ELEMENTS SMIL 2.1 Timing//EN"
    "http://www.w3.org/2005/SMIL21/SMIL-timing.mod">
  %SMIL.timing-mod;
  
<!-- ============================================================================================  -->
<!--  Here we define the proper parts of LimSee3.         =======================================  -->
<!--  Several different namespaces are used in this part: =======================================  -->
<!--  1) http://limsee3.gforge.inria.fr/ns                =======================================  -->
<!--     is the default namespace                         =======================================  -->
<!--     and it is also prefixed by 'limsee3:'            =======================================  -->
<!--  2) http://limsee3.gforge.inria.fr/ns/template       =======================================  -->
<!--     is prefixed by 'template:'                       =======================================  -->
<!--  3) http://www.w3.org/2005/SMIL21/Language           =======================================  -->
<!--     prefixed with 'smil:'                            =======================================  -->
<!--  4) http://www.w3.org/XML/1998/namespace             =======================================  -->
<!--     prefixed by 'xml:'                               =======================================  -->
<!--  5) http://www.w3.org/1999/XSL/Transform             =======================================  -->
<!--     prefixed by 'xsl:'                               =======================================  -->
<!-- ============================================================================================  -->

<!-- === Common entities ===================================================================== -->
<!ENTITY % common.attr   "xml:lang  CDATA  #IMPLIED " >
<!ENTITY % id.local.name "localId"                            >
<!ENTITY % id.local      "%id.local.name;   CDATA   #IMPLIED" >
<!ENTITY % id.ref.name   "refId"                              >
<!ENTITY % id.ref        "%id.ref.name;  CDATA  #REQUIRED"    >
<!ENTITY % media.type    " image | audio | video | text | animation " >
<!ENTITY % lock          "lock  (locked|unlocked)  #IMPLIED"  >
<!ENTITY % regAlign.attr "regAlign (topLeft | topMid | topRight | midLeft | center |
                                    midRight | bottomLeft | bottomMid | bottomRight) #IMPLIED " >

<!ENTITY % ns.limsee3  "
   xmlns          CDATA  #FIXED 'http://ns.inria.fr/limsee3'
   xmlns:limsee3  CDATA  #FIXED 'http://ns.inria.fr/limsee3'
">
<!ENTITY % ns.templates "  xmlns:template CDATA  #FIXED  'http://ns.inria.fr/limsee3/template' " >
<!ENTITY % ns.smil      "  xmlns:smil  CDATA  #FIXED  'http://www.w3.org/2005/SMIL21/Language' " >
<!ENTITY % ns.xml       "  xmlns:xml   CDATA  #FIXED  'http://www.w3.org/XML/1998/namespace' ">
<!ENTITY % ns.xslt      "  xmlns:xsl  CDATA  #FIXED  'http://www.w3.org/1999/XSL/Transform' " >

<!-- === Document ============================================================================ -->
<!ELEMENT document (head?, object?)>
<!ATTLIST document
 %common.attr;
 %lock;
 %ns.limsee3;
 %ns.templates;
 %ns.smil;
 %ns.xml;
 %ns.xslt;
>

<!-- === Head elements: head & meta ========================================================== -->
<!ELEMENT head (meta)* >
<!ATTLIST head 
  %common.attr;
  %lock; 
>

<!ELEMENT meta EMPTY >
<!ATTLIST meta
  name    CDATA #REQUIRED
  content CDATA #REQUIRED
  %lock;
  %common.attr;
>

<!-- === Objects ============================================================================= -->
<!ELEMENT object (related?, children?, timing?, layout?, text?) >
<!ATTLIST object
  %common.attr;
  %id.local;
  type  (complex | %media.type; | area)  #IMPLIED
  template:types     CDATA               #IMPLIED
  template:refModel  CDATA               #IMPLIED
  src   CDATA                            #IMPLIED
  %lock;
>

<!ELEMENT text (#PCDATA) >

<!-- === Object contents: related ============================================================ -->
<!ELEMENT related (ref)* >
<!ATTLIST related %lock;  >

<!ELEMENT ref EMPTY >
<!ATTLIST ref
  %id.local.name;  CDATA  #REQUIRED
  %id.ref;
  %lock;
>

<!-- === Object contents: children =========================================================== -->
<!ELEMENT children (template:model | template:invite | object)* >
<!ATTLIST children %lock; >

<!-- === Object contents: timing ============================================================= -->
<!ELEMENT timing (smil:seq | smil:par | smil:excl | timingRef)* >
<!ATTLIST timing
  %SMIL.endsync.attrib;
  %SMIL.fill.attrib;
  %SMIL.timecontainer.attrib;
  %SMIL.Test.attrib;
  %SMIL.customTestAttr.attrib;
  %SMIL.skip-content.attrib;
  %lock;
>

<!ELEMENT timingRef EMPTY >
<!ATTLIST timingRef
  %id.ref;
  %lock;
>

<!-- === Object contents: layout ============================================================= -->
<!ELEMENT layout (smil:region | layoutRef | regPoint)*>
<!ATTLIST layout
  %SMIL.common-layout-attrs;
  %SMIL.region-attrs;
  %lock;
  regPoint  CDATA  #IMPLIED
  %regAlign.attr;
>

<!ELEMENT layoutRef EMPTY >
<!ATTLIST layoutRef
  region  CDATA  #IMPLIED
  %id.ref;
  %lock;
>

<!ELEMENT regPoint EMPTY >
<!ATTLIST regPoint
  name    CDATA  #REQUIRED
  top     CDATA  'auto'
  left    CDATA  'auto'
  right   CDATA  'auto'
  bottom  CDATA  'auto'
  %regAlign.attr;
>

<!-- === Templates =========================================================================== -->
<!ELEMENT template:model (object) >
<!ATTLIST template:model 
  %lock; 
  min   CDATA  #IMPLIED
  max   CDATA  #IMPLIED
  name  CDATA  #REQUIRED
>

<!ELEMENT template:invite (#PCDATA) >
<!ATTLIST template:invite
  type (%media.type;) #REQUIRED 
  src  CDATA          #IMPLIED
  %lock;
  %common.attr;
>

Expanded SMIL Definitions

The previous DTD makes use of some entities imported from SMIL 2.1. For information, we expand here their definitions.

  1. smil:region element as re-defined in LimSee3:
    <!-- This is how smil:region is defined after expanding all entities: -->
    <!ELEMENT smil:region (smil:region | layoutRef | regPoint)* >
    <!ATTLIST smil:region 
            systemBitrate             CDATA              #IMPLIED
            systemCaptions            (on|off)           #IMPLIED
            systemLanguage            CDATA              #IMPLIED
            systemOverdubOrSubtitle   (overdub|subtitle) #IMPLIED
            systemRequired            CDATA              #IMPLIED
            systemScreenSize          CDATA              #IMPLIED
            systemScreenDepth         CDATA              #IMPLIED
            systemAudioDesc           (on|off)           #IMPLIED
            systemOperatingSystem     NMTOKEN            #IMPLIED
            systemCPU                 NMTOKEN            #IMPLIED
            systemComponent           CDATA              #IMPLIED
            system-bitrate            CDATA              #IMPLIED
            system-captions           (on|off)           #IMPLIED
            system-language           CDATA              #IMPLIED
            system-overdub-or-caption (overdub|caption)  #IMPLIED
            system-required           CDATA              #IMPLIED
            system-screen-size        CDATA              #IMPLIED
            system-screen-depth       CDATA              #IMPLIED
            customTest                CDATA              #IMPLIED
            skip-content              (true|false)       'true'
            xml:base                  CDATA              #IMPLIED
            id                        ID                 #IMPLIED
            class                     CDATA              #IMPLIED
            title                     CDATA              #IMPLIED
            longdesc                  CDATA              #IMPLIED
            alt                       CDATA              #IMPLIED
            xml:lang                  CDATA              #IMPLIED
            background-color          CDATA              #IMPLIED
            height                    CDATA              'auto'
            width                     CDATA              'auto'
            backgroundColor           CDATA              #IMPLIED
            bottom                    CDATA              'auto'
            left                      CDATA              'auto'
            right                     CDATA              'auto'
            top                       CDATA              'auto'
            z-index                   CDATA              #IMPLIED
            showBackground            (always|whenActive) 'always'
            fit                  (hidden|fill|meet|scroll|slice)   #IMPLIED
            regionName                CDATA              #IMPLIED
    >
  2. Layout attribute sets:
    <!-- Here we expand the %SMIL.common-layout-attrs; and %SMIL.region-attrs; entities -->
    <!ENTITY % SMIL.common-layout-attrs "
            height              CDATA    'auto'
            width               CDATA    'auto'
            backgroundColor     CDATA    #IMPLIED
    ">
    <!ENTITY % SMIL.region-attrs "
            bottom              CDATA    'auto'
            left                CDATA    'auto'
            right               CDATA    'auto'
            top                 CDATA    'auto'
            z-index             CDATA    #IMPLIED
            showBackground      (always|whenActive)   'always'
            fit       (hidden|fill|meet|meetBest|scroll|slice)   #IMPLIED 
    ">
  3. Timing elements smil:seq, smil:par and smil:excl as re-defined in LimSee3:
    <!-- This is how smil:seq is defined after expanding all entities: -->
    <!ELEMENT smil:seq (smil:par | smil:seq | smil:excl | smil:switch | smil:prefetch | smil:a | timingRef)*>
    <!ATTLIST smil:seq
            fill (remove|freeze|hold|transition|auto|default) 'default'
            dur                         CDATA           #IMPLIED
            repeatCount                 CDATA           #IMPLIED
            repeatDur                   CDATA           #IMPLIED
            begin                       CDATA           #IMPLIED
            end                         CDATA           #IMPLIED
            repeat                      CDATA           #IMPLIED
            min                         CDATA           '0'
            max                         CDATA           'indefinite'
            restart              (always|whenNotActive|never|default)           'default'
            restartDefault       (inherit|always|never|whenNotActive)           'inherit'
            syncBehavior         (canSlip|locked|independent|default)           'default'
            syncTolerance               CDATA           'default'
            syncBehaviorDefault  (canSlip|locked|independent|inherit)           'inherit'
            syncToleranceDefault        CDATA           'inherit'
            fillDefault          (remove|freeze|hold|transition|auto|inherit)   'inherit'
            systemBitrate               CDATA           #IMPLIED
            systemCaptions              (on|off)        #IMPLIED
            systemLanguage              CDATA           #IMPLIED
            systemOverdubOrSubtitle     (overdub|subtitle) #IMPLIED
            systemRequired              CDATA           #IMPLIED
            systemScreenSize            CDATA           #IMPLIED
            systemScreenDepth           CDATA           #IMPLIED
            systemAudioDesc             (on|off)        #IMPLIED
            systemOperatingSystem       NMTOKEN         #IMPLIED
            systemCPU                   NMTOKEN         #IMPLIED
            systemComponent             CDATA           #IMPLIED
            system-bitrate              CDATA           #IMPLIED
            system-captions             (on|off)        #IMPLIED
            system-language             CDATA           #IMPLIED
            system-overdub-or-caption   (overdub|caption) #IMPLIED
            system-required             CDATA           #IMPLIED
            system-screen-size          CDATA           #IMPLIED
            system-screen-depth         CDATA           #IMPLIED
            customTest                  CDATA           #IMPLIED
            region                      CDATA           #IMPLIED
            xml:base                    CDATA           #IMPLIED
            id                          ID              #IMPLIED
            class                       CDATA           #IMPLIED
            title                       CDATA           #IMPLIED
            longdesc                    CDATA           #IMPLIED
            alt                         CDATA           #IMPLIED
            xml:lang                    CDATA           #IMPLIED
            abstract                    CDATA           #IMPLIED
            author                      CDATA           #IMPLIED
            copyright                   CDATA           #IMPLIED
    >
    
    <!-- This is how smil:par is defined after expanding all entities: -->
    <!ELEMENT smil:par (smil:par | smil:seq | smil:excl | smil:switch | smil:prefetch | smil:a | timingRef)*>
    <!ATTLIST smil:par
            endsync                     CDATA           'last'
            -- and all attributes defined in smil:seq
    >
    
    <!-- This is how smil:excl is defined after expanding all entities: -->
    <!ELEMENT smil:excl ((smil:par | smil:seq | smil:excl | smil:switch | smil:prefetch | smil:a | timingRef)*
                         | smil:priorityClass+ )>
    <!ATTLIST smil:excl
            endsync                     CDATA           'last'
            skip-content                (true|false)    'true'
            -- and all attributes defined in smil:seq
    >
  4. Timing attribute sets:
    <!-- Here we expand the following entities:%SMIL.endsync.attrib;  %SMIL.fill.attrib; 
         %SMIL.timecontainer.attrib;  %SMIL.Test.attrib;  %SMIL.customTestAttr.attrib; 
         %SMIL.regionAttr.attrib;  %SMIL.skip-content.attrib;                            -->
    <!ENTITY % SMIL.endsync.attrib "
            endsync                     CDATA           'last'
    ">
    
    <!ENTITY % SMIL.fill.attrib "
            fill (remove|freeze|hold|transition|auto|default) 'default'
    ">
    
    <!ENTITY % SMIL.timecontainer.attrib "
            dur                         CDATA           #IMPLIED
            repeatCount                 CDATA           #IMPLIED
            repeatDur                   CDATA           #IMPLIED
            begin                       CDATA           #IMPLIED
            end                         CDATA           #IMPLIED
            repeat                      CDATA           #IMPLIED
            min                         CDATA           '0'
            max                         CDATA           'indefinite'
            restart              (always|whenNotActive|never|default)           'default'
            restartDefault       (inherit|always|never|whenNotActive)           'inherit'
            syncBehavior         (canSlip|locked|independent|default)           'default'
            syncTolerance               CDATA           'default'
            syncBehaviorDefault  (canSlip|locked|independent|inherit)           'inherit'
            syncToleranceDefault        CDATA           'inherit'
            fillDefault          (remove|freeze|hold|transition|auto|inherit)   'inherit'
    ">
    
    <!ENTITY % SMIL.Test.attrib "
            systemBitrate               CDATA           #IMPLIED
            systemCaptions              (on|off)        #IMPLIED
            systemLanguage              CDATA           #IMPLIED
            systemOverdubOrSubtitle     (overdub|subtitle) #IMPLIED
            systemRequired              CDATA           #IMPLIED
            systemScreenSize            CDATA           #IMPLIED
            systemScreenDepth           CDATA           #IMPLIED
            systemAudioDesc             (on|off)        #IMPLIED
            systemOperatingSystem       NMTOKEN         #IMPLIED
            systemCPU                   NMTOKEN         #IMPLIED
            systemComponent             CDATA           #IMPLIED
            system-bitrate              CDATA           #IMPLIED
            system-captions             (on|off)        #IMPLIED
            system-language             CDATA           #IMPLIED
            system-overdub-or-caption   (overdub|caption) #IMPLIED
            system-required             CDATA           #IMPLIED
            system-screen-size          CDATA           #IMPLIED
            system-screen-depth         CDATA           #IMPLIED
    ">
    
    <!ENTITY % SMIL.customTestAttr.attrib "
            customTest                  CDATA           #IMPLIED
    ">
    
    <!ENTITY % SMIL.regionAttr.attrib "
            region                      CDATA           #IMPLIED
    ">
    
    
    <!ENTITY % SMIL.skip-content.attrib "
            skip-content          (true|false)    'true'
    ">

References

[DocEng2006] R. Deltour and C. Roisin, The LimSee3 Multimedia Authoring Model. ACM Symposium on Document Engineering, 10-13 October 2006, Amsterdam, The Netherlands, pp. 173-175 (PDF)

[TelCoPs2006] R. Deltour and A. Guerraz and C. Roisin, Multimedia Authoring for CoPs. 1st International Workshop on Building Technology Enhanced Learning solutions for Communities of Practice, Crete, Greece, 2 October 2006, pp. 60-69 (PDF)

[SMIL 2.1] Synchronized Multimedia Integration Language (SMIL 2.1), W3C Recommendation 13 December 2005, http://www.w3.org/TR/2005/REC-SMIL2-20051213/