epkml DTD Quick Reference

Es wird im folgenden SGML-Diktion verwendet.

Variablen

EPKML verfügt über Variablen. Sie werden durch die Klammerung $name$ von Werten und Inhalten getrennt; für Namen bestehen ansonsten keine Beschränkungen. Variablen können sowohl Attributwerte als auch Inhalte aufnehmen.

Variablen werden entweder über var, über Parameter oder die Benennung von Elementen eingeführt. Der Sichtbarkeitsbereich ist durch die natürliche Blockstruktur vorgegeben. Es gilt statische Bindung.

Variablen dürfen auf der rechten Seite von Attributzuweisungen auftreten, sowie als Inhalt von Elementen. Die Verwendung einer im aktuellen Block nicht deklarierten Variable ist ein Fehler.

Einige Namen sind reserviert:

Systemseitig werden einige eindimensionale Arrays (Vektoren) zur Verfügung gestellt (etwa aus der Datenbank). Auf die einzelnen Elemente kann dann mit $name[i]$ zugegriffen werden (erstes Element ist $name[1]$) Vektoren können benutzerseitig nicht angelegt werden.

Auf Attribute benannter Elemente wird durch Qualifikation mit dem Attributnamen zugegriffen.

Kontrollfluß

Der Kontrollfluß ist sequentiell. Er verzweigt nach der Ausführung eines Statements, wenn nicht explizit anders angegeben, zum nächsten in Aufschreibungsreihenfolge. Der Kontrollfluß beginnt bei der ersten Anweisung in main.

Nebenläufigkeit

Einige Anweisungen werden nebenläufig ausgeführt (sie kehren sofort zum Aufrufort zurück). Es sind dies open für video, audio und slide-show (bzw. diese Elemente selbst, falls ihr Status opened ist) und applet (falls dadurch ein neuer Prozeß erzeugt wird).

Zustand

Der Zustand eines Elementes kann opened, closed oder suspended sein. Der Wert diese Zustandes (status) kann in der Spezifikation festgelegt werden. Defaultwert is opened. Dieser Wert wird nur von den Anweisungen open,close und suspend geändert. Es ist nicht erlaubt den status mit set zu setzen. Ein Element, das sein Attribut invisible gesetzt hat, ist am Bildschirm nicht sichtbar, belegt aber trotzdem Platz.

History

Über Themen und Formatvorlagen wird eine Navigationsgeschichte erstellt. Jede Bewegung im Katalog mit up, down, previous, next und open (für ein Thema oder einen Eintrag) wird in dieser History verzeichnet. Mit back gelangt man zum letzten Eintrag der History.

Einfügung von Dateien

Externe Dateien werden mittels external ENTITIES eingebunden. In der DOCTYPE Aussage wird eine ENTITY für jede einzubindende Datei definiert. Es wird der externe Name der Datei angegeben und eine interne Bezeichnung vergeben. An der Stelle, wo die Datei eingefügt werden soll, wird diese Bezeichnung (in entity notation) angegeben. Dateien dürfen überall auftreten. Lediglich der nach allen Einfügungen entstehende Gesamttext muß ein korrektes EPKML-Programm ergeben.

<!DOCTYPE EPKML SYSTEM "epkml.dtd" [
<!ENTITY template SYSTEM "template.epk">]>

<epkml>
  <header
    title="The Shortest EPKML Catalogue"
    author="Me"
    date="01/01/01"
    last-modified="01/01/01">
  <externals>
  <styles> 
  <definitions>
<theme name="general">
 <extension result="cities">
   <sql>
     select name,video,image
     from tourist
   </sql>
 &template;   
 </extension>
</theme>
  <main>
<open name="general">
    <exit>
</epkml>

<additional>

Hiermit ist die Navigation zu Zusatzprodukte gewährleistet. Die Datenbank muß darauf vorbereitet sein.
  <button name=additionals
    xpos=10 ypos=10>
    Felix coniunctio!
    <img src=nearby.gif>
    <on-click>
      <additional>
    </on-click>
  </button>

<and>

Hiermit werden zusätzliche Werte, Attribute und Elemente zu einer variant definiert. Jede variant kann mit name eindeutig Identifiziert werden. Das Element, dessen Attribute variiert werden sollen, wird in object angegeben, das Attribut in attribute und einen der Werte in value.
  <variant object=presentation attribute=background  value="blue">
      <or  value="green">
      </or>
 
     <and object=products-on-sale  attribute=background  value="red">
       <and object=titel  attribute=fontcolor value="white">
             <or  value="black">
 
 </variant>

<applet>

Zur Anbindung externer Funktionalität dient, wie in Java, applet. Im Attribut function wird ein Funktionsaufruf angegeben. Die in result spezifizierte EPKML-Variable nimmt das Ergebnis des Funktionsaufrufs auf. Parameter für die Funktion werden im Inhalt von applet durch param definiert und übergeben. Die Codierung ist implementationsabhängig.

Für dieses Element können folgende Attribute angegeben werden:

  <applet name=stat
    function=statistics
    result=output
    width=600
    height=450>
    <param name=period value=12>
    <param name=year value=1995>
  </applet>

<around>

Hiermit werden die Elemente, die in einer flowbox umflossen werden sollen, beschrieben. Mit align wird die Ausrichtung des Layouts dieser Elemente festgelegt.
  <flowbox name=in-the-left  align=left
                           width=200  height=200> 
    <around>
     <img src=sun.gif  width=5 height=50>
    </around>
    <p>
        The new product-line for the summer weather.
        Try our new T-shirts, they are on-sale!
    <img src=shirt1.gif  width=100 height=100>
    <p>
        colors: green, orange, blue
    <img src=shirt2.gif width=100 height=100>
  </flowbox> 

<attribute>

Das in name spezifizierte Attribut eines mit macro definierten Makros wird auf den in value angegebenen Wert gesetzt.
  <macro name=dummy
    attribs="a"
    elems="e">
    <img src=$dummy.a$>
    <p>$e$</p>
  </macro>

  <expand name=dummy>
    <attribute name=a value=12>
    <element name=e>
      Hello world!
    </element>
  </expand>

<audio>

Hiermit werden Klänge angegeben. Der Ablauf des Audiofiles wird mit Hilfe der folgenden Knöpfe realisiert: play-button, stop-button, forward-button und reverse-button . Als Klangquelle ist in src ein Filename oder Datenbankverweis anzugeben. Die Daten müssen im durch format bestimmten Format vorliegen. (Es sollten zumindest die Formate SND und AU möglich sein.) Die Länge des Soundfiles kann aus duration erfahren werden.

Für Audioelemente können zusätzlig folgende Attribute angegeben werden:

  <audio name=mozart
    src=/audio/41.au
    format=au> 
    <play-button name=play
      xpos=0
      ypos=5>
    <img src=play.gif>
    <on-click>
      <-- play of audio file is made automatically -->
      <slide-show name=mozart-slides
        src=../slides/mozart
        format=slide
        interval=0.5
        height=30
        width=40
        status=opened>
    </on-click>
    <stop-button name=stop>
      <img src=stop.gif>
      <on-click>
        <close name=mozart-slides>
      </on-click>
  </audio> 

<b>

Der enthaltene Text wird fett gedruckt.

Für dieses Element können folgende Attribute angegeben werden:

  With stupidity the gods themselves struggle in vain.
  <b>
    Die Jungfrau von Orleans (1801), III.vi
  </b> 

<back>

Damit erreicht man das letzte, in einer History gespeicherte theme oder den letzten, in einer History gespeicherten Eintrag aus extension (innerhalb eines theme).

Der Kontrollfluß verzweigt zum letzten Thema bzw. Eintrag.

Ist das Attribut hierarchical gesetzt, so wird in jedem Falle zum letzten in einer History gespeicherten theme verzweigt.

  <button name=back
    xpos=10 ypos=10>
    Just say where we are, then go back to the car.
    <img src=back.gif>
    <on-click>
      <back>
    </on-click>
  </button>

<back-button>

Erzeugt einen Knopf (wie button), der back auslösen soll.

Der Knopf wird nicht angezeigt, falls ein back ohne Wirkung bliebe.

Durch Setzen des Attributs hierachical erreicht man dasselbe für ein hierarchisches back.

Hat back-button keinen Inhalt, so wird eine Standarddarstellung gewählt; der Knopf führt back (unter Berücksichtigung des Attributs hierarchical) aus.

Mit align wird die Ausrichtung des Knopfes bestimmt.

  <extension result=general-result>
    <sql>
      SELECT name
      FROM database
    </sql>
  <template>   
  <page name=general-page>
    <frame name=general-frame>
      <p>This is a $general-result.name$.</p>
      <previous-button>
      <next-button>
      <back-button>
    </frame>
  </page>
 </template>
</extension>   

<big>

Der enthaltene Text wird mit vergrößerter Schrift gedruckt.

Für dieses Element können folgende Attribute angegeben werden:

  <big>
    Either he's dead or my watch has stopped.
  </big>
  <s>
    Groucho Marx
  <s>

<br>

Erzeugt einen Zeilenumbruch, ohne einen neuen Paragraphen zu beginnen.

Für einen Zeilenumbruch können folgende Attribute angegeben werden:

 
  Freude, schöner Götterfunken,<br>
  Tochter aus Elysium,<br>
  Wir betreten Feuertrunken,<br>
  Himmlische, dein Heiligtum.<br>
  Deine Zauber binden wieder,<br>
  Was die Mode streng geteilt,<br>
  Alle Menschen werden Brüder<br>
  Wo dein sanfter Flügel weilt.<br>
  <b>
    An die Freude (1785)
  </b>

<browser>

Es wird ein Listenfenster dargestellt, dessen Einträge ( option) untereinander angeordnet werden, und das, wenn nötig, horizontale und vertikale Scrollbars erhält. Durch Mausanwahl gehen die Optionen in den selektierten Zustand über. Mehrfachauswahl ist möglich. Mit on-selected werden die Aktionen beschrieben, die bei der Optionsselektion erfolgen sollen, mit on-deselected solche für die Optionsdeselektion. Die Einträge können mit make-options dynamisch erzeugt werden.

Für einen Browser können folgende Attribute angegeben werden:

 
  <set name=time-unit value=1s>

  <window name=SSV>
    Look at the section ON-sale!
    We are in SSV!
  </window>

  <window name=WSV>
    <video name=ski status=closed>
  </window>

  <browser>
    <option summer>
      <on-selected>
        <set name=summer value=yes>
        <open name=SSV>
        <on-end-of name=SSV time=5>
        </on-end-of>
      </on-selected>
      <on-deselected>
        <close name=SSV>   
      </on-deselected>

    <option winter selected>
      <on-selected>
        <set name=winter value=yes>
          <open name=WSV>
        <on-end-of name=WSV time=5>
        </on-end-of>
          <close name=WSV>
        </on-selected>
        <on-deselected>
          <close name=ski>   
          <on-end-of name=ski time=1>
        </on-end-of>
          <close name=WSV>
        </on-deselected>

    <option autumn disabled>
      <on-selected>
        <set name=autumn value=yes>
      </on-selected>

    <option spring disabled>
      <on-selected>
        <set name=spring value=yes>
      </on-selected>
  </browser>

<browser-cell>

Es wird ein Zelleneintrag einer Zeile browser-row in einem Tabellenbrowser multiple-browser beschrieben, dessen Inhalt beliebig ist und eventuell auch leer sein kann. Ist der Wert von colspan oder rowspan größer als eins,so gilt der Eintrag diese entsprechende Anzahl von Einträgen, die spalten- oder zeilenweise eingetragen werden.Mit align wird die Ausrichtung des Zelleneintrags einer Zeile bestimmt.

Für Tabelleneinträge können zusätzlig folgende Attribute angegeben werden:

  <p>
    Click on the product to see it!
  <multiple-browser name=choose
    style=quelle
    attribs="extension">
    <browser-row>  
      <browser-cell>SONY 314
      <browser-cell>VCR
      <browser-cell><img src=/images/vcr.gif>
      <browser-cell>1
      <browser-cell>999.90
      <on-selected>
        <sql name=mb-image>
          SELECT prod-image
          FROM products
          WHERE code=$mb[1][mb.selected]$
        </sql>
        <img name=aux src=$mb-image.prod.image$>
           <set name=aux.status value=closed>
      </on-selected>
    </browser-row>

    <browser-row>
      <browser-cell>FFXXL
      <browser-cell>BH
      <browser-cell><img src=/images/bh.gif>
      <browser-cell>2
      <browser-cell>35.99
      <on-selected>
        ...
      </on-selected>
    </browser-row>

    <browser-row>
      <browser-cell>SP 231
      <browser-cell>Spielzeug
      <browser-cell><img src=/images/lego.gif>
      <browser-cell>2
      <browser-cell>15
      <on-selected>
        ...
      <on-deselected>
    </browser-row>
  </multiple-browser>

<browser-row>

Eine Zeile eines multiple-browser besteht aus Zellen ( browser-cell). Ist line gesetzt, so wird die Tabellenzeile von der folgenden durch eine Linie abgetrennt; dabei sind Einträge, die mehrere Zeilen umfassen sollen, zu beachten. Mit align wird die Ausrichtung der Zeile des Browsers bestimmt.

Für multiple-browser Zeilen können folgende Attribute angegeben werden:

  <p>
    Click on the product to see it!
  <multiple-browser name=choose
    style=quelle
    attribs="extension">
    <browser-row>  
      <browser-cell>SONY 314
      <browser-cell>VCR
      <browser-cell><img src=/images/vcr.gif>
      <browser-cell>1
      <browser-cell>999.90
      <on-selected>
        <sql name=mb-image>
          SELECT prod-image
          FROM products
          WHERE code=$mb[1][mb.selected]$
        </sql>
        <img name=aux src=$mb-image.prod.image$>
         <set name=aux.status value=closed>
      </on-selected>
    </browser-row>

    <browser-row>
      <browser-cell>FFXXL
      <browser-cell>BH
      <browser-cell><img src=/images/bh.gif>
      <browser-cell>2
      <browser-cell>35.99
      <on-selected>
        ...
      </on-selected>
    </browser-row>

    <browser-row>
      <browser-cell>SP 231
      <browser-cell>Spielzeug
      <browser-cell><img src=/images/lego.gif>
      <browser-cell>2
      <browser-cell>15
      <on-selected>
        ...
      <on-deselected>
    </browser-row>
  </multiple-browser>

<button>

Durch Knöpfe und Hyperlinks ( hyperlink) werden die Navigationsmöglichkeiten in einem Katalog auf der Layoutseite repräsentiert. Die eigentliche Navigation übernimmt die Regie. Knöpfe können unsichtbar und nicht anwählbar sein. Ein Knopf besitzt eine Darstellung für den nicht angewählten, den angewählten und den nicht anwählbaren Zustand. Die Aktionen, die nach Drücken der Maustaste erfolgen sollen, werden mit on-click beschrieben.

Für Buttons können folgende Attribute angegeben werden:

  <button
    style=sport-style>
    <img src=stop.gif>
    <on-click>
      <close name=sport-presentation>
    </on-click>
  </button>

<cell>

Es wird der Tabelleneintrag beschrieben, dessen Inhalt beliebig ist, eventuell auch leer sein kann. Ist der Wert von colspan größer als eins, so gilt der Eintrag diese entsprechende Anzahl von Einträgen, die spaltenweise eingetragen werden. align bestimmt die Ausrichtung des Tabelleneintrags in der Tabelle.

Für Tabelleneinträge können zusätzlig folgende Attribute angegeben werden:

  <tabular name=prices
    colspec="lcl"
    status=opened>
    <row line>
      <cell>Name</cell> <cell>Size</cell> <cell>Price</cell>
    </row>

    <row line>
      <cell>zapato</cell> <cell>35-40</cell> <cell>140</cell>
    </row>
           
    <row line>
      <cell>chaussure</cell> <cell>41-48</cell> <cell>160</cell>
    </row>
  </tabular>

<checkbox>

Mehrere Optionen ( option) können aus einer vorgegebenen Menge ausgewählt werden.

Für eine checkbox können folgende Attribute angegeben werden:

 
  <set name=radio-status value=$radio.selected$>
  <-- The old status of the radio: either selected or not selected -->

  <window name=cd-question>
    A CD-player is available only in conjunction with a Radio.
    <button name=ok
      xpos=10
      ypos=10>
      <img src=ok.gif>
      <on-click>
        <set name=cd-player.selected value=selected>
        <set name=radio.selected value=selected>
        <close name=cd-question>
      </on-click>
    </button>

    <button name=no
      xpos=80
      ypos=10>
      <img src=no.gif>
      <on-click>
        <set name=cd-player.selected value=>
        <close name=cd-question>
      </on-click>
    </button>
  </window>

  <checkbox name=cd-player-choose
    style=mercedes-benz> 
    <option name=cd-player>CD-player
      <on-selected>
        <set name=cd-player value=selected>
        <open name=cd-question>
      </on-selected>
      <on-deselected>
        <set name=cd-player value=>
        <set name=radio.selected value=$radio-status$>
      </on-deselected>
    <option>Radio
  </checkbox>

<class>

Es wird die Definition einer externer Klasse wiedergegeben. Der Name der Klasse steht in name, die Slots (Attribute) in slots und die Methoden in methods.

  <class name=my-window-with-logo
    slots="logo"
    methods="redraw iconize">

<click>

Wählt das im Attribut name angegebene interaktive Element ( button, option, etc.) an (simuliert einen Mausclick). Dieses Kommando ist innerhalb von Demonstrationen ( demo) erlaubt.
  <demo name=general-demo> 
    <set name=time-unit value=sec>
    <open name=winter-theme> <-- a window presentation with two buttons -->
    <click name=help>        <-- a click on the help button -->
                             <-- the help window is opened  -->
    <on-end-of time=5>  
    <close name=help-window> <-- I could close it by a click
                                 on the close button -->
    <open name=pres-video format=mov>
    <on-end-of name=pres-video>
    <next>                   <-- go to the next theme -->
    <on-end-of time=5>
  ��<applet�name=stat
  ����function=fade>         <-- screen fade, a function call
                                 without parameters -->
    <exit>
  </demo> 

<clicked>

Hiermit wird das Layout für den selektierten Zustand eines button beschrieben.
  <button visible=yes style=sport-style>
    <clicked>
      <img src=stop.gif>
    <on-click>
      <close name=sport-presentation>
    </on-click>
  </button>

<close>

Hiermit wird das in name angegebene Element geschlossen. Alle zu dem Element gehörigen Prozesse (zeitabhängigen Elemente) werden abgebrochen und alle im Element beinhaltete Elemente werden rekursiv geschlossen. Alle betroffenen Elemente erhalten den status closed. Die gelöschten Elemente verschwinden von der aktuellen Bildschirmdarstellung und belegen keinen Platz mehr. Der Kontrollfluß ändert sich nicht.
  <close name=theme-1>
  <close name=$t$>

<default>

Jedem Layoutelement können Voreinstellungen zugewiesen werden. Dazu wird ein Teil der zu dem im Inhalt von default angegebenen Element gehörigen Attributen mit Werten versehen. Voreinstellungen, die in default angegeben werden, priorisieren Voreinstellungen von stylesheets.

Einzelvoreinstellungen können Erweiterungen anderer sein; dazu wird in extends eine Liste von Stylesheetnamen angegeben, deren zu dem im Inhalt von default angegebenen Element zugehörige Voreinstellung erweitert bzw. überladen wird.

  <stylesheet name=my-catalog-style
              extends=catalog-style>
    <default extends=other-catalog-style>
      <p baselineskip=12pt>
    </default>
  </stylesheet>

<definitions>

Im Definitionsteil werden Variablen (var), Makros (macro) und Themen (theme) festgelegt. Daneben können Top-level-Elemente (window und page), audio und Elemente der Service-Gruppe vorkommen. Sie haben dann immer den Status closed.

  <definitions>
    <var name=months value=12>
    <macro name=dummy  attribs="a"  elems="e">
      <img src=$dummy.a$>
      <p>$e$</p>
    </macro>
  </definitions>

<demo>

Läßt eine Demonstration ablaufen: Als Inhalt wird eine Coroutine (aus Aktionen) definiert; der Kontrollfluß kehrt bei jedem on-end-of ohne Attribute zu der Demonstration zurück. Die interaktiven Elemente können mit click angewählt werden. Schließlich wird eine Demonstration mit exit beendet.
  <demo name=general-demo> 
    <set name=time-unit value=sec>
    <open name=winter-theme> <-- a window presentation with two buttons -->
    <click name=help>        <-- a click on the help button -->
                             <-- the help window is opened  -->
    <on-end-of time=5>  
    <close name=help-window> <-- I could close it by a click
                                 on the close button -->
    <open name=pres-video format=mov>
    <on-end-of name=pres-video>
    <next theme>             <-- go to the next theme -->
    <on-end-of time=5>
  ��<applet�name=stat
  ����function=fade>         <-- screen fade, a function call
                                 without parameters -->
    <exit demo>
  </demo> 

<dialog-window>

Hiermit wird ein Fenster definiert, daß innerhalb ein anderes Fenster geöffnet wird. Das open des Dialog-Fensters kehrt erst zum Aufrufenden Fenster zurück, wenn das Dialog-Fenster geschlossen wurde. Mit dem Attribut modal können Dialog-Fenster auch als nicht-modal definiert werden.

Ein Dialog-Fenster kann folgende Attribute haben:

  <dialog-window name=registration-help
    title="Registration-help"
    width=400
    height=200>
    Instructions for registration
    1. ...
    2. ...
    <button>
      <p> O.K.
      <on-click>
        <close name=registration-help>
      </on-click>
    </button>
  </dialog-window>

<disabled>

Hiermit wird das Layout für den nicht anwählbaren Zustand eines button beschrieben.
  <button
    style=sport-style>
    <img src=stop-enabled.gif>
    <clicked>
      <img src=stop.gif>
    <disabled>
      <img src=stop-disabled.gif>
    <on-click>
      <close name=sport-presentation>
    </on-click>
  </button>

<down>

Damit erreicht man das erste (in Aufschreibungsreihenfolge) Unterthema theme in Bezug auf das aktuelle. Ist das aktuelle Thema das unterste, so ist dies ein Fehler.

Das aktuelle Thema wird in einer History gespeichert.

Der Kontrollfluß verzweigt zum ersten Unterthema.

  <button name=down
    xpos=10 ypos=10>
    Go down the hierachy.
    <img src=down.gif>
    <on-click>
      <down>
    </on-click>
  </button>

<element>

Das in name spezifizierte Element eines mit macro definierten Makros wird dem Inhalt von element als Wert versehen.
  <macro name=dummy
    attribs="a"
    elems="e">
    <img src=$dummy.a$>
    <p>$e$</p>
  </macro>

  <expand name=dummy>
    <attribute name=a value=12>
    <element name=e>
      Hello world!
    </element>
  </expand>

<em>

Der enthaltene Text wird besonders hervorgehoben.

Für dieses Element können folgende Attribute angegeben werden:

  <em>
    This text is emphasized, normally it will appear in italics.
  </em>

<empty>

Der Inhalt wird ausgeführt, falls die im Attribut which angegebene Vektor- oder Feldvariable oder das Ergebnis der sql-Abfrage leer ist.

  <sql result=on-sale-opt>
    SELECT code prod-name prod-color prod-desc
    FROM products-table
    WHERE saison=$saison$ AND status=on-sale
  </sql>
    
  <non-empty which=on-sale-opt>
    <itemize>
      <make-items from=on-sale-opt>
        Product: $on-sale-opt.prod-name$
      </make-items>
    </itemize>
  </non-empty>    
  <empty>     
    There are no products ON-SALE in $saison$.
  </empty>

<enumerate>

Es wird eine Liste beschrieben, die eine Folge von Einträgen ( item) umfaßt, die durchnumeriert werden. Die Numerierungsart wechselt bei verschachtelten Listen von Ebene zu Ebene. Zur Angabe einer Anfangsnummer dient number. Das Attribut enumstyle gibt die Art der Numerierungszeichen an. Es sollten zumindest die Typen arabischer, römischer, groß-römischer, alphabetischer und griechisch-alphabetischer Numerierung möglich sein. Die Einträge können mit make-items dynamisch erzeugt werden.

Für Aufzählungen können folgende Attribute angegeben werden:

 
  <enumerate
    enumstyle=roman
    number=i>
    <item> First item
    <item> Second item
      ...
    <item> Last item
  </enumerate>

<epkml>

Ein Katalog besteht aus:

  <epkml>
    <header
      title = "The Shortest EPKML Catalogue"
      author = "Me"
      date = "01/01/01"
      last-modified = "01/01/01">
    <externals>
    <styles>
    <definitions>
    <main>
      <exit>
  </epkml>

<exceptions>

Für einige Einträge von extension, für die zum Beispiel das definierte template unbefriedigende Ergebnisse liefert, können Ausnahmen spezifiziert werden. In einer sql-Anweisung werden die Ausnahmen angegeben (das Ergebnis muß eine Untermenge von extension sein), in template eine neue Formatvorlage. Es können Ausnahmen für exceptions definiert werden.
 <theme name=general>
   <extension result=general-result>
    <sql>
        SELECT name
        FROM database
    </sql>
    <template>
     <page name=general-page>
         <p>This is a $general-result.name$.</p>
        <next-button>
      </page>
    </template>
   </extension>
   <exceptions>
    <sql>
        SELECT name
        FROM database
        WHERE name=[AEIOU].*
    </sql>
    <template>
      <page name=general-exception-page>
           <p>This is an $general-result.name$.</p>
          <next-button>
      </page>
    </template>
   </exceptions>
 <theme=sub-general>
      ...
    </theme>
  </theme>

<exit>

Verläßt den Katalog oder die aktuelle Demonstration demo, falls das Attribut demo gesetzt ist.
  <button name=bye
    xpos=10 ypos=10>
    QUIT
    <img src=quit.gif>
    <on-click>
      <exit>
    </on-click>
  </button>

<expand>

Ein im Attribut name angegebenes, mit macro definiertes, Makro wird expandiert. Die aktuellen Attribut- und Elementwerte werden durch attribute und element übergeben.
  <macro name=dummy
    attribs="a"
    elems="e">
    <img src=$dummy.a$>
    <p>$e$</p>
  </macro>

  <expand name=dummy>
    <attribute name=a value=12>
    <element name=e>
      Hello world!
    </element>
  </expand>

<extension>

Die Datenbankeinträge, die von einem theme behandelt werden sollen, sind hier durch eine sql-Anweisung zu spezifizieren und die Darstellung dieser Datenbankeinträge mit der Formatvorlage ( template) zu beschrieben. Nach einem leeren Ergebnis der Datenbanksuche kann mittels empty geprüft werden. Dem Ergebnis der Datenbankabfrage kann im Attribut result ein Name gegeben werden. Es wird als Liste von Einträgen aufgefaßt; die Sortierung spielt damit eine Rolle (s. previous, next).
 <theme name=general>
   <extension result=general-result>
    <sql>
        SELECT name
        FROM database
    </sql>
    <template>
     <page name=general-page>
         <p>This is a $general-result.name$.</p>
        <next-button>
      </page>
    </template>
   </extension>
   <exceptions>
    <sql>
        SELECT name
        FROM database
        WHERE name=[AEIOU].*
    </sql>
    <template>
      <page name=general-exception-page>
           <p>This is an $general-result.name$.</p>
          <next-button>
      </page>
    </template>
   </exceptions>
 <theme=sub-general>
      ...
    </theme>
  </theme>

<externals>

Hier werden externe Klassen (class) und Datenbankschemata (scheme) dem Katalog bekanntgemacht. Es ist ein Fehler, in applet oder sql Klassen oder Schemata zu verwenden, die nicht in externals deklariert wurden.

  <externals> 
    <class name=my-window-with-logo
      slots="logo"
      methods="redraw iconize">
    <scheme name=my-database>
      <table name="prod-desc"
        columns="code price desc">
    </scheme>
  </externals>

<flowbox>

Hiermit koennen die in around beschriebene Elemente mit den im restlichen Inhalt von flowbox angegebenen Elementen umflossen werden.

Eine flowbox kann folgende Attribute haben:

  <flowbox name=in-the-left  align=left
                           width=200  height=200> 
    <around>
     <img src=sun.gif  width=5 height=50>
    </around>
    <p>
        The new product-line for the summer weather.
        Try our new T-shirts, they are on-sale!
    <img src=shirt1.gif  width=100 height=100>
    <p>
        colors: green, orange, blue
    <img src=shirt2.gif width=100 height=100>
  </flowbox> 

<font>

Hiermit wird die Schrift beschrieben.

Für dieses Element können folgende Attribute angegeben werden:

  <font
    fontsize=+3>
    ON-SALE
  </font>

<foreach>

Es wird eine Schleife über die Datenbankeinträge in in ausgeführt. Es wird dieselbe Notation wie bei page benutzt.
  <demo>
    <sql result=demo>
      SELECT *
      FROM products-table
      WHERE status=interesting
    </sql>

    <foreach in=result>
      <open name=$result$>
  </demo>

<forward-button>

Beschreibt einen Knopf, der einen Film (video), eine Audiosequenz (audio) oder eine Diashow (slide-show) vorspult. Die Aktionen, die nach Drücken der Maustaste erfolgen sollen, werden mit on-click beschrieben. Dem Knopf kann einen einen Namen mit name gegeben werden.

Für forward-button können folgende Attribute angegeben werden:

  <video name=mode>
    <play-button name=play
      xpos=0
      ypos=5>
      <img src=play.gif>
      <on-click>
        <-- play of video mode is made automatically -->
        <set name=play.invisible value=invisible>
        <set name=stop.invisible value=>
        <set name=pause.invisible value=>
      </on-click>

    <stop-button name=stop>
      <img src=stop.gif>
      <on-click>
        <set name=play.invisible value=>
        <set name=stop.invisible value=>
        <set name=pause.invisible value=invisible>
      </on-click>

    <pause-button name=pause>
      <img src=pause.gif>
      <on-click>
        <set name=play.invisible value=>
        <set name=stop.invisible value=invisible>
        <set name=pause.invisible value=invisible>
      </on-click>

    <forward-button name=fast-forward>
      <img src=ff.gif>
    </forward-button>

    <rewind-button name=rewind
      xpos=20
      ypos=5>
      <img src=rew.gif>
    </rewind-button>
  </video> 

<frame>

Rahmen sorgen für einer Gruppierung der enthaltenen Elemente. Sie ermöglichen die eventuelle Unterlegung eines Hintergrunds mittels des Attributes background und eine Umrahmung mit margin oder padding. Mit align wird die Ausrichtung des Rahmens bestimmt.

Ein Rahmen kann zusätzlich folgende Attribute haben:

 
  <frame name=sport-presentation
    title="SUMMER SPORT"
    xpos=10
    ypos=10
    width=400
    height=200
    lftpad=25
    rgtpad=25
    toppad=25
    botpad=25
    layer=0>
    <video name=sport-presentation-video
      src=/videos/sport-presentation.mov
      format=mov
      status=closed>
    <open name=sport-presentation-video>
  </frame> 

<header>

Die Einleitung zum Katalog besteht aus den folgenden Angaben:
  <epkml>
    <header
      title = "The Shortest EPKML Catalogue"
      author = "Me"
      date = "01/01/01"
      last-modified = "01/01/01">

<heading>

Setzt die enthaltenen Element als Überschrift.

Jede Überschrift bekommt eine laufende Nummer (number). Das Attribut leftmargin bestimmt die Einzugstiefe vom linken Rand, baselineskip gibt den Abstand der Schriftlinien zweier Zeilen (Zeilenabstand) an und mit align wird die horizontale Ausrichtung gesetzt.

Für Überschriften können zusätzlig folgende Attribute angegeben werden:

 
  <heading name=myheading
    align=left
    baselineskip=2
    layer=1
    number=1
    leftmargin=2pt> 
    HELLO WORLD!
  </heading>

<horizontal-slider>

Horizontale Schiebeelemente dienen zur Steuerung komplexerer (horizontaler) Auswahl- und Anwahlstrukturen.

In der Mitte des Scrollbars befindet sich ein verschiebbarer Knopf, slider-box, links der slider-previous-Knopf, um den Zugriff auf ein kontextuell vorhergehendes Element zu ermöglichen, rechts der slider-next-Knopf, um nachfolgende Elemente zu erreichen. Dadurch wird auch die Stellung des Mittelknopfes beeinflußt.

Für Sliders können folgende Attribute angegeben werden:

  <frame name=myframe elems="photo">
    $photo$
  </frame>

  <sql result=my-query>
    select image
    from   prod
    where  price < 1000
  </sql>

  <horizontal-slider name=prod-slider
    style=quelle
    height=21
    width=210
    layer=1
    step=2>
    <slider-previous>
      <img src=previous.gif>
    <slider-next>
      <img src=next.gif>
    <slider-box>
      <img src=box.gif> 
    <on-reposition>   
      <open name=myframe>
        <element name=photo>
          <img src=$myquery.photo[myslider.position]$
        </element>
      </open>
    </on-reposition>   
  </horizontal-slider>

<hyperlink>

Hiermit wird ein Link definiert. Nach der Verfolgung dieses Links wird eine andersfarbige Darstellung für den Inhalt gewählt. Das Ziel des Links wird mit ref beschrieben und muß immer angegeben werden.

Für Hyperlinks können zusätzlig folgende Attribute angegeben werden:

  Take a look at the new
  <hyperlink ref=mode-catalogue>mode</hyperlink> catalogue!

<i>

Der enthaltene Text wird kursiv gedruckt.

Für dieses Element können folgende Attribute angegeben werden:

  <i>
    Ich bin der Geist, der stets verneint.
  </i>
  <b>
    Johann Wolfgang von Goethe
  </b>

<img>

Hiermit wird die Darstellung von Bildern unterstützt. Die Bildquelle muß in src mittels eines URL (universal resource locators) angegeben werden. Diese Daten liegen in einem bestimmten format vor; es sollten zumindest folgende Formate möglich sein: GIF, JPEG, TIFF und BMP. Mit align wird die Ausrichtung des Bildes bestimmt.

Für Bilder können zusätzlig folgende Attribute angegeben werden:

 
  <img src=../images/summer-mode.gif
    format=gif
    style=company  <!-- all my images are transparent and in the
                        background they get our company logo -->
    status=opened
    layer=2
    height=20
    width=30
    xpos=1
    ypos=1>

<input>

Dieses Element dient der Eingabe eines beliebigen Textes.

Für Eingaben können folgende Attribute angegeben werden:

 
  Enter your ZIP code:
  <input name=zip-code 
    default=80802
    maxlength=5>

<item>

Ist die Beschreibung eines Eintrags in einer Liste (listing, itemize oder enumerate).

Für dieses Element können folgende Attribute angegeben werden:

 
  <itemize> 
    <item> First item
    <item> Second item
      ...
    <item> Last item
  </itemize>

<itemize>

Es wird eine Liste beschrieben, die eine Folge von items umfaßt, die jeweils mit einem Markierungselement (term) versehen sein können. Bei verschachtelten Listen ist dieses Zeichen von Ebene zu Ebene verschieden. Im Unterschied zu listing wiederholt sich hier das Markierungszeichen, das mit bulletstyle für jedes item beschrieben wird. Die Einträge können mit make-items dynamisch erzeugt werden.

Für Listen können folgende Attribute angegeben werden:

  <itemize>
    <term>
      <img src=red-bullet.gif>
    </term>

    <item> First item
    <item> Second item
    ...
    <item> Last item
  </itemize>

<lang>

Hiermit wird die für die enthaltenen Elemente zu verwendende Sprache spezifiziert. Der Name der Sprache muß in name angegeben werden.

Für die Sprache können folgende Attribute angegeben werden:

  <p>
    <lang name=spanish>
      Bien haya el que inventó el sueño, capa que cubre
      todos los humanos pensamientos, manjar que quita la hambre, agua
      que ahuyenta la sed, fuego que calienta el frió,
      frió que templa el ardor, y, finalmente, moneda general
      con que todas las cosas se compran, balanza y peso que iguala al
      pastor con el rey y al simple con el discreto.
  </p>

<listing>

Es wird eine Liste beschrieben, die eine Folge von Einträgen item umfaßt, die jeweils mit einem Markierungselement (term) versehen sein können. Im Unterschied zu itemize kann hier das Markierungselement für jedes item verschieden sein.

Für Listen können folgende Attribute angegeben werden:

  <listing>
    <term>
      <img src=first.gif>
    <item>
      First item

    <term>
      <img src=second.gif>
    <item>
      Second item
    ...
    <term>
      <img src=last.gif>
    <item>
      Last item
  </listing>

<macro>

Es wird ein neues Makro definiert. Sein Name name muß global eindeutig sein. Die Namen seiner Attribute (denen Werte zugewiesen werden können) werden in attribs aufgelistet, die Namen seiner Elemente (die Inhalt haben können) in elems aufgelistet. Die Namen müssen paarweise verschieden sein.

Auf diese Attribute und Elemente wird mit derselben Konvention zugegriffen wie auf Variablen ($name$). Existiert bereits eine Variable mit dem verwendeten Namen, so ist der Attribut- bzw. Elementname mit dem Makronamen zu qualifizieren ($name.name$)

Ein Makro wird über expand aufgerufen.

  <macro name=dummy
    attribs="a"
    elems="e">
    <img src=$dummy.a$>
    <p>$e$</p>
  </macro>

  <macro name=my-image
    attribs="extension"
    elems="text">
    <img src=$myimage.extension$>
    <em>$text$</em>
  </macro>

<main>

Hier wird die Initialisierung des Katalogs vorgenommen. Die im Inhalt aufgeführten Aktionen werden sequentiell ausgeführt.
  <main>
    <open-theme name=main-theme>
    <close-theme name=main-theme>
    <exit>
  </main>

<make-items>

Es werden aus Datenbankeinträgen itemize- oder enumerate-Einträge erzeugt. Die Tabellenvariable wird im Attribut from spezifiziert. Es wird dieselbe Notation wie bei page benutzt.
  <sql result=out>
    SELECT code price prod-name
    FROM products
    WHERE saison = winter
  </sql>

  New line of products:
  <itemize>
    <make-items from=out>
      $out.prod-name$ -- $out.prod-price$
  </itemize>

<make-options>

Es werden aus Datenbankeinträgen Optionen ( option) für einen Browser ( browser) erzeugt. Die Tabellenvariable wird im Attribut from spezifiziert. Es wird dieselbe Notation wie bei page benutzt.
  <window name=abc
    elems="prod-name prod-price">
    The product $prod-name$ has a price of $prod-price$.
  </window>

  <sql result=out>
    SELECT code price prod-name
    FROM products
    WHERE saison=winter
  </sql>

  <browser name=dynamic-browser>
    <make-options from=out>
      $out.prod-name$ $out.price$
      <on-selected>
        <open name=abc>
          <element name=prod-name>
            $out.prod-name$
          <element name=prod-price>
            $out.price$
        </open>
      </on-selected>
    </make-options>
  </browser>

  <browser name=dynamic-browser-ii>
    <option>$out.prod-name[1]$ $out.price[1]$
    <option>$out.prod-name[2]$ $out.price[2]$
    <option>Levis 501 DM 200,-
    <option>$out.prod-name[4]$ $out.price[4]$
    <option>$out.prod-name[3]$ $out.price[3]$
  </browser>

<menu-title>

Hiermit wird die Titelzeile eines Pull-down menu ( pull-down) beschrieben.

Für die Titelzeile können folgende Attribute angegeben werden:

  <pull-down name=general-menu>
    <menu-title>
      <option>Info
        <option>Info panel
          <on-selected>
            <open name=info-panel>
          </on-selected>
        <option>Preferences...
          <on-selected>
            <open name=preferences>
          </on-selected>
        <option>Help
          <on-selected>
            <open name=help>
          </on-selected>

      <option>Edit
        <option>Cut
        <option>Copy
        <option>Paste
          <on-selected>
            <applet function=paste>
          </on-selected>

      <option>Quit
        <on-selected>
          <exit>
        </on-selected>
    </menu-title>
  </pull-down>

<multiple-browser>

Damit wird ein tabellenartiger Browser dargestellt, dessen Zeilen, in browser-row geklammert werden; er erhält, wenn nötig, horizontale und vertikale Scrollbars.

Für multiple-browser können folgende Attribute angegeben werden:

  <p>
    Click on the product to see it!
  <multiple-browser name=choose
    style=quelle
    attribs="extension">
    <browser-row>  
      <browser-cell>SONY 314
      <browser-cell>VCR
      <browser-cell><img src=/images/vcr.gif>
      <browser-cell>1
      <browser-cell>999.90
      <on-selected>
        <sql name=mb-image>
          SELECT prod-image
          FROM products
          WHERE code=$mb[1][mb.selected]$
        </sql>
        <img name=aux src=$mb-image.prod.image$>
         <set name=aux.status value=closed>
      </on-selected>
    </browser-row>

    <browser-row>
      <browser-cell>FFXXL
      <browser-cell>BH
      <browser-cell><img src=/images/bh.gif>
      <browser-cell>2
      <browser-cell>35.99
      <on-selected>
        ...
      </on-selected>
    </browser-row>

    <browser-row>
      <browser-cell>SP 231
      <browser-cell>Spielzeug
      <browser-cell><img src=/images/lego.gif>
      <browser-cell>2
      <browser-cell>15
      <on-selected>
        ...
      <on-deselected>
    </browser-row>
  </multiple-browser>

<next>

Damit erreicht man den nächsten Eintrag in extension in Bezug auf den aktuellen oder, falls das Attribut theme gesetzt ist, das nächste Thema im Bezug auf das aktuelle. Ist das Attribut circular gesetzt und ist der aktuelle Eintrag der letzte in der Tabelle, so ist der nächste der erste der Tabelle (Zirkularität); dasselbe gilt für Themen. Ist das Attribut circular nicht gesetzt und ist der aktuelle Eintrag der letzte in der Tabelle, so bleibt dies ohne Auswirkungen; und ebenso für Themen.

Der aktuelle Eintrag (das aktuelle Thema) wird in einer History gespeichert.

Der Kontrollfluß verzweigt zum nächsten Eintrag (Thema).

  <button name=next
    xpos=10 ypos=10>
    Go to the next entry.
    <img src=next.gif>
    <on-click>
      <next>
    </on-click>
  </button>

<next-button>

Erzeugt einen Knopf (wie button), der innerhalb einer Hierarchie next auslösen soll.

Mit align wird die Ausrichtung des Knopfes bestimmt.Ist das Attribut circular nicht gesetzt, so wird der Knopf nicht angezeigt, falls ein next ohne Wirkung bliebe. Mit dem Attribut theme wird dasselbe für Themen (theme) erreicht.

Hat next-button keinen Inhalt, so wird eine Standarddarstellung gewählt; der Knopf führt next (unter Berücksichtigung des Attributs theme) aus.

  <extension result=general-result>
    <sql>
      SELECT name
      FROM database
    </sql>
  <template>   
  <page name=general-page>
    <frame name=general-frame>
      <p>This is a $general-result.name$.</p>
      <previous-button>
      <next-button>
      <back-button>
    </frame>
  </page>
 </template>
</extension>   

<non-empty>

Der Inhalt wird ausgeführt, falls die im Attribut which angegebene Vektor- oder Feldvariable oder das Ergebnis der sql-Abfrage nicht leer ist.

  <sql result=on-sale-opt>
    SELECT code prod-name prod-color prod-desc
    FROM products-table
    WHERE saison=$saison$ AND status=on-sale
  </sql>
    
  <non-empty which=on-sale-opt>
    <itemize>
      <make-items from=on-sale-opt>
        Product: $on-sale-opt.prod-name$
      </make-items>
    </itemize>
  </non-empty>    
  <empty>     
    There are no products ON-SALE in $saison$.
  </empty>

<on-click>

Hiermit werden die Aktionen beschrieben, die durch das Anklicken eines Knopfes ( button) erfolgen sollen.
  <page name=summer-temp>
    <window name=summer-sport-presentation
      title="Summer Sport"
      xpos=10
      ypos=10
      width=400
      height=200
      lftpad=25
      rgtpad=25
      toppad=25
      botpad=25>
      <img src=summer-logo.gif>
      Welcome to the summer-sport Catalogue '95-'96!
      <video name=summer-video
        src=/videos/summer-video.mov>
      <button
        style=sport-style>
        Go!
        <on-click>
          <close name=summer-video>
          <close name=summer-sport-presentation>
          <open  name=summer-sport>
        </on-click>
      </button>
    </window>
  </page>

<on-deselected>

Hiermit werden die Aktionen beschrieben, die durch das Deselektieren einer Option in einem browser, in einer checkbox, in einem pop-up-menu, in einem radio-button oder in einem pull-down-menu erfolgen sollen.
 
  <set name=time-unit value=1s>

  <window name=SSV>
    Look at the section ON-sale!
    We are in SSV!
  </window>

  <window name=WSV>
    <video name=ski status=closed>
  </window>

  <browser>
    <option summer>
      <on-selected>
        <set name=summer value=yes>
        <open name=SSV>
        <on-end-of name=SSV time=5>
        </on-end-of>
      </on-selected>
      <on-deselected>
        <close name=SSV>   
      </on-deselected>

    <option winter selected>
      <on-selected>
        <set name=winter value=yes>
          <open name=WSV>
        <on-end-of name=WSV time=5>
        </on-end-of>
          <close name=WSV>
        </on-selected>
        <on-deselected>
          <close name=ski>   
          <on-end-of name=ski time=1>
        </on-end-of>
          <close name=WSV>
        </on-deselected>

    <option autumn disabled>
      <on-selected>
        <set name=autumn value=yes>
      </on-selected>

    <option spring disabled>
      <on-selected>
        <set name=spring value=yes>
      </on-selected>
  </browser>

<on-end-of>

Nach dem Beenden eines zeitabhängigen Prozesses, vorausgesetzt daß das umschliessende Element noch geöffnet ist, werden die in on-end-of angegebenen Anweisungen ausgeführt.
<window name=presentation>
  <video name=pres src = "/videos/summer-video.mov"
       format = mov status = closed>
    <stop-button>
  </video>
  <button name = back align = "bottom left">
    <img src = back.gif>
    <on-click>
      <close name = presentation>
    </on-click>
  </button>
  <open name = pres>
  <on-end-of = pres>
     <close name = presentation>
</window>

<on-no-option>

Hiermit werden die Aktionen beschrieben, die in einem browser oder in einer multiple-browser erfolgen sollen, wenn keine Option selektiert ist.
 
  <set name=time-unit value=1s>

  <window name=SSV>
    Look at the section ON-sale!
    We are in SSV!
  </window>

  <window name=WSV>
    <video name=ski status=closed>
  </window>

  <browser>
    <option summer>
      <on-selected>
        <set name=summer value=yes>
        <open name=SSV>
        <on-end-of name=SSV time=5>
        </on-end-of>
      </on-selected>
      <on-deselected>
        <close name=SSV>   
      </on-deselected>

    <option winter selected>
      <on-selected>
        <set name=winter value=yes>
          <open name=WSV>
        <on-end-of name=WSV time=5>
        </on-end-of>
          <close name=WSV>
        </on-selected>
        <on-deselected>
          <close name=ski>   
          <on-end-of name=ski time=1>
        </on-end-of>
          <close name=WSV>
        </on-deselected>

    <option autumn disabled>
      <on-selected>
        <set name=autumn value=yes>
      </on-selected>

    <option spring disabled>
      <on-selected>
        <set name=spring value=yes>
      </on-selected>
  </browser>

<on-reposition>

Jede Positionsänderung der slider-box kann hierdurch abgefangen werden.
  <frame name=myframe elems="photo">
    $photo$
  </frame>

  <sql result=my-query>
    select image
    from   prod
    where  price < 1000
  </sql>

  <horizontal-slider name=prod-slider
    style=quelle
    height=21
    width=210
    layer=1
    step=2>
    <slider-previous>
      <img src=previous.gif>
    <slider-next>
      <img src=next.gif>
    <slider-box>
      <img src=box.gif> 
    <on-reposition>   
      <open name=myframe>
        <element name=photo>
          <img src=$myquery.photo[myslider.position]$
        </element>
      </open>
    </on-reposition>   
  </horizontal-slider>

<on-selected>

Hiermit werden die Aktionen beschrieben, die durch das Selektieren einer Option in einem browser, in einer checkbox, in einem pop-up-menu, in einem radio-button oder in einem pull-down-menu erfolgen sollen.
 
  <set name=time-unit value=1s>

  <window name=SSV>
    Look at the section ON-sale!
    We are in SSV!
  </window>

  <window name=WSV>
    <video name=ski status=closed>
  </window>

  <browser>
    <option summer>
      <on-selected>
        <set name=summer value=yes>
        <open name=SSV>
        <on-end-of name=SSV time=5>
        </on-end-of>
      </on-selected>
      <on-deselected>
        <close name=SSV>   
      </on-deselected>

    <option winter selected>
      <on-selected>
        <set name=winter value=yes>
          <open name=WSV>
        <on-end-of name=WSV time=5>
        </on-end-of>
          <close name=WSV>
        </on-selected>
        <on-deselected>
          <close name=ski>   
          <on-end-of name=ski time=1>
        </on-end-of>
          <close name=WSV>
        </on-deselected>

    <option autumn disabled>
      <on-selected>
        <set name=autumn value=yes>
      </on-selected>

    <option spring disabled>
      <on-selected>
        <set name=spring value=yes>
      </on-selected>
  </browser>

<open>

Hiermit wird das in name angegebene Element angezeigt und alle in diesem Element enthaltenen Anweisungen (einschließlig der in Elementdefinitionen versteckten open) ausgefuehrt. Somit werden rekursiv alle enthaltenen Elemente indirekt angezeigt und deren Anweisungen ausgefuehrt. Die für dieses Element mit attribs definierten Attribute werden mit attribute als Parameter übergeben werden, die mit elems definierten Subelemente mit element. Werden gewissen Attributen und Elementen keine Werte zugewiesen, so gelten die beim letzten Öffnen des betroffenen Elements verwendeten Werte als Voreinstellung; wurde das Element noch nie geöffnet, so ist ein Zugriff auf einen undefinierten Parameter ein Fehler.

Der Status des zu öffnenden Elements wird auf opened geändert.

Der Kontrollfluß verzweigt zu dem zu öffnenden Element und kehrt nach Ausfuehrung der Anweisungen wieder zurueck. Die genaue Auswirkung hängt vom Wert des Attributs status des Elements ab:

opened
Alle enthaltenen Elemente bleiben unverändert außer den zeitabhängige Elemente, die neu gestartet werden, wenn deren status-Wert opened ist; bei status-Wert suspended oder close bleiben sie aber unverändert.
suspended
Zeitabhängige Elemente werden an der Stelle, an der sie angehalten wurden, fortgesetzt; die Parameterwerte werden nicht beachtet. Für zeitunabhängige Elemente gilt dasselbe wie für opened. Status wir auf opened gesetzt.
closed
Die Parameterwerte werden eingesetzt und das Element neu gezeichnet und alle in diesem Element enthaltenen Anweisungen ausgefuehrt. Zeitabhängige Elemente werden neu gestartet. Status wir auf opened gesetzt.

Zeitabhängige Elemente sind: video, audio und slide-show und applet.html.

Für Themen gilt zusätzlich: Es wird der erste Datenbankeintrag aus extension mit dem zugehörigen page angezeigt. Gibt es einen solchen nicht, so wird das erste Subthema angezeigt. Ist so insgesamt keine Darstellung innerhalb des Themas möglich, so ist dies ein Fehler.

Für Datenbankeinträge gilt: Es wird die Dokumentvorlage (gefüllt mit den Eintragsdaten) des ersten theme in der in definitions angegebenen Themenhierarchie angezeigt, das in seiner extension diesen Eintrag aufweist.

  <open name=theme-1>
  <open name=$t$>
  <sql result=entry>
    SELECT product-id
    FROM product-database
    WHERE product-name="Schillerlocke"
  </sql>
  <open name=$entry$>

  <frame name=sport-presentation
    title="Summer Sport">
    <img name=sport-movie
      src=$image$
      format=gif>
  </frame> 
  <set name=image value="../images/spring.gif">
  <open name=sport-presentation>

<option>

Alle Auswahlmöglichkeiten in einem browser, in einer checkbox, in einem pop-up-menu, in einem radio-button oder in einem pull-down-menu finden über Optionen statt. Der Zustand einer Option kann selektiert, nicht-selektiert und nicht anwählbar sein. Der Selektion der Option kann über on-selected eine Aktionenfolge zugewiesen werden, der Deselektion über on-deselected eine weitere.

Eine Option kann folgende Attribute haben:

  <window name=credit-card>
    We only accept VISA-card (Die Freiheit nehm' ich mir!)
    <button name=ok
      xpos=10
      ypos=10>
      <img src=ok.gif>
      <on-click>
        <close name=credit-card>
      </on-click>
    </button>
  </window>

  <window name=pay>
    How do you want to pay?
    <radio-button name=one-of-them> 
      <option selected>
        Credit card
        <on-selected>
          <open name=credit-card>
          <set name=way value=credit-card>
        </on-selected>

      <option>
        Cash
        <on-selected>
          <set name=way value="Cash">
        </on-selected>

      <option> Check
        <on-selected>
          <set name=way value="Check">
        </on-selected>

      <option disabled>
        I am not going to pay.
        <on-selected>
          <set name=way value="no-paying">
        </on-selected>
    </radio-button> 
  </window>

<or>

Hiermit werden die alternativen Werte, Attribute und Elemente zu einer variant definiert. Jede variant kann mit name eindeutig Identifiziert werden. Das Element, dessen Attribute variiert werden sollen, wird in object angegeben, das Attribut in attribute und einen der Werte in value.
  <variant object=presentation attribute=background  value="blue">
      <or value="green">
      </or>
 
     <and object=products-on-sale  attribute=background  value="red">
       <and object=titel  attribute=fontcolor value="white">
             <or  value="black">
 
 </variant>

<order>

Die Waren im Einkaufskorb orders werden tatsächlich bestellt.
  <button>
    Order
    <on-click>
      <order
        orders="actual-orders">
    </on-click>
  </button>

<p>

Es wird ein neuer Absatz begonnen.

Für dieses Element können folgende Attribute angegeben werden:

  <p
    align=right
    color=red>
    Let heaven exist, even though our estate be hell.
  </p>

<page>

Ist ein Rahmen auf der top-level Ebene, daß für einer Gruppierung der enthaltenen Elemente sorgt. Sie ermöglichen die eventuelle Unterlegung eines Hintergrunds.

Es wird implizit ein wait -Statement zum Abschluß eingefügt.

 <theme name=general>
   <extension result=general-result>
    <sql>
        SELECT name
        FROM database
    </sql>
    <template>
     <page name=general-page>
         <p>This is a $general-result.name$.</p>
        <next-button>
      </page>
    </template>
   </extension>
   <exceptions>
    <sql>
        SELECT name
        FROM database
        WHERE name=[AEIOU].*
    </sql>
    <template>
      <page name=general-exception-page>
           <p>This is an $general-result.name$.</p>
          <next-button>
      </page>
    </template>
   </exceptions>
 <theme=sub-general>
      ...
    </theme>
  </theme>

<par>

Innerhalb einer mit slice abgegrenzten Zeitscheibe werden die durch par getrennten Teile parallel zueinander ausgeführt.

  <time-line end-of=12s
    periodical
    slice=3s>
    <slice>
      <par>
        <open name=m>
      <par>
        <open name=n>
    <slice>
      <par>
        <close name=m>
      <par>
        <close name=n>
    <slice end-of=1s>
      <open name=o>
    <slice end-of=5s>
      <close name=o>
  </time-line>

<param>

Zur Übergabe von Parametern an applet. Das Attribut name dient der Identifikation, in value kann eine beliebige Zeichenkette (unter Benutzung von EPKML-Variablen) angegeben werden.

  <applet name=stat
    function=statistics
    result=output
    width=600
    height=450>
    <param name=period value=12>
    <param name=year value=1995>
  </applet>

<pause-button>

Beschreibt einen Knopf, der eine Bildsequenz ( video), eine Audiosequenz ( audio) oder eine Diashow ( slide-show) stoppt, wenn diese nicht schon angehalten worden war, und wieder startet, wenn diese gestoppt war. Die Aktionen, die nach Drücken der Maustaste erfolgen sollen, werden mit on-click beschrieben. Dem Knopf kann einen einen Namen mit name gegeben werden.

Für pause-button können folgende Attribute angegeben werden:

  <video name=mode> 
    <play-button name=play
      xpos=0
      ypos=5>
      <img src=play.gif>
      <on-click>
        <-- play of video mode is made automatically -->
        <set name=play.invisible value=invisible>
        <set name=stop.invisible value=>
        <set name=pause.invisible value=>
      </on-click>

    <stop-button name=stop>
      <img src=stop.gif>
      <on-click>
        <set name=play.invisible value=>
        <set name=stop.invisible value=>
        <set name=pause.invisible value=invisible>
      </on-click>

    <pause-button name=pause>
      <img src=pause.gif>
      <on-click>
        <set name=play.invisible value=>
        <set name=stop.invisible value=invisible>
        <set name=pause.invisible value=invisible>
      </on-click>

    <forward-button name=fast-forward>
      <img src=ff.gif>
    </forward-button>

    <rewind-button name=rewind
      xpos=20
      ypos=5>
      <img src=rew.gif>
    </rewind-button>
  </video> 

<play-button>

Beschreibt einen Knopf, der einen Film ( video), eine Audiosequenz ( audio) oder eine Diashow ( slide-show) startet. Die Aktionen, die nach Drücken der Maustaste erfolgen sollen, werden mit on-click beschrieben. Dem Knopf kann einen Namen mit name gegeben werden.

Für play-button können folgende Attribute angegeben werden:

  <video name=mode> 
    <play-button name=play
      xpos=0
      ypos=5>
      <img src=play.gif>
      <on-click>
        <-- play of video mode is made automatically -->
        <set name=play.invisible value=invisible>
        <set name=stop.invisible value=>
        <set name=pause.invisible value=>
      </on-click>

    <stop-button name=stop>
      <img src=stop.gif>
      <on-click>
        <set name=play.invisible value=>
        <set name=stop.invisible value=>
        <set name=pause.invisible value=invisible>
      </on-click>

    <pause-button name=pause>
      <img src=pause.gif>
      <on-click>
        <set name=play.invisible value=>
        <set name=stop.invisible value=invisible>
        <set name=pause.invisible value=invisible>
      </on-click>

    <forward-button name=fast-forward>
      <img src=ff.gif>
    </forward-button>

    <rewind-button name=rewind
      xpos=20
      ypos=5>
      <img src=rew.gif>
    </rewind-button>
  </video> 

<pop-up>

Der Inhalt aus mehreren Optionen ( option) wird als Pop-up menu dargestellt. Im unangewählten Zustand wird die aktuelle Wahl angezeigt. Wird dieses Element angeclickt, klappt die gesamte Auswahl aus. Eine andere Option kann dann ausgewählt werden. Mehrfachauswahl ist nicht möglich.

Für ein Pop-up menu können folgende Attribute angegeben werden:

  <pop-up name=saison-pop-up-menu
    style=quelle>
    <option name=summer selected>
      Summer
      <on-selected>
        <close name=summer-on-sale-sport>
        <open name=prod>
      </on-selected>

    <option name=spring>
      Spring
      <on-selected>
        <close name=summer-on-sale-sport>
        <open name=prod>
      </on-selected>

    <option name=autumm>
      Autumn
      <on-selected>
        <close name=summer-on-sale-sport>
        <open name=prod>
      </on-selected>

    <option winter>
      Winter
      <on-selected>
        <close name=summer-on-sale-sport>
        <open name=prod>
      </on-selected>
  </pop-up>

<previous>

Damit erreicht man den vorherigen Eintrag in extension in Bezug auf den aktuellen oder, falls das Attribut theme gesetzt ist, das vorherige Thema im Bezug auf das aktuelle. Ist das Attribut circular gesetzt und ist der aktuelle Eintrag der erste in der Tabelle, so ist der vorherige der letzte der Tabelle (Zirkularität); dasselbe gilt für Themen. Ist das Attribut circular nicht gesetzt und ist der aktuelle Eintrag der erste in der Tabelle, so bleibt dies ohne Auswirkungen; und ebenso für Themen.

Der aktuelle Eintrag (das aktuelle Thema) wird in einer History gespeichert.

Der Kontrollfluß verzweigt zum vorherigen Eintrag (Thema).

  <button name=previous
    xpos=10 ypos=10>
    Go to the previous entry.
    <img src=prev.gif>
    <on-click>
      <previous>
    </on-click>
  </button>

<previous-button>

Erzeugt einen Knopf (wie button), der innerhalb einer Hierarchie previous auslösen soll.

Mit align wird die Ausrichtung des Knopfes bestimmt.Ist das Attribut circular nicht gesetzt, so wird der Knopf nicht angezeigt, falls ein previous ohne Wirkung bliebe. Mit dem Attribut theme wird dasselbe für Themen (theme) erreicht.

Hat previous-button keinen Inhalt, so wird eine Standarddarstellung gewählt; der Knopf führt previous (unter Berücksichtigung des Attributs theme) aus.

  <extension result=general-result>
    <sql>
      SELECT name
      FROM database
    </sql>
  <template>   
  <page name=general-page>
    <frame name=general-frame>
      <p>This is a $general-result.name$.</p>
      <previous-button>
      <next-button>
      <back-button>
    </frame>
  </page>
 </template>
</extension>   

<pull-down>

Damit erzeugt man die von den meisten Benutzeroberflächen gewohnten Pull-down menus. Durch Anwahl eines Elements der Titelleiste ( menu-title) entfaltet sich die gesamte Auswahl. Lediglich eine Option ( option) kann dann ausgewählt werden.

Für ein Pull-down menu können folgende Attribute angegeben werden:

  <pull-down name=general-menu>
    <menu-title>
      <option>Info
        <option>Info panel
          <on-selected>
            <open name=info-panel>
          </on-selected>
        <option>Preferences...
          <on-selected>
            <open name=preferences>
          </on-selected>
        <option>Help
          <on-selected>
            <open name=help>
          </on-selected>

    <menu-title>
      <option>Edit
        <option>Cut
        <option>Copy
        <option>Paste
          <on-selected>
            <applet function=paste>
          </on-selected>

    <menu-title>
      <option>Quit
        <on-selected>
          <exit>
        </on-selected>
    </menu-title>
  </pull-down>

<q>

Die enthaltenen Elemente werden als Zitat gesetzt.

Für Zitate können folgende Attribute angegeben werden:

  <q>
    The original is unfaithful to the translation
  </q>
  <p>
    (Henley's translation of Beckford's Vathek)
  </p>

<question-form>

Zur Durchführung von Benutzerbefragungen. Der Name des Fragebogens steht in name. In users kann der Name einer Kundendatenbank angegeben werden, in die das Ergebnis eingetragen wird.
  <question-form name="my-registration-form"
    users="user-database">

<radio-button>

Eine Option kann aus einer vorgebenen Menge mehrer ( option) ausgewählt werden. Der Unterschied zu checkbox liegt darin, daß höchstens ein Element selektiert werden kann.

Für ein radio-button können folgende Attribute angegeben werden:

  <window name=credit-card>
    We only accept VISA-card (Die Freiheit nehm' ich mir!)
    <button name=ok
      xpos=10
      ypos=10>
      <img src=ok.gif>
      <on-click>
        <close name=credit-card>
      </on-click>
    </button>
  </window>

  <window name=pay>
    How do you want to pay?
    <radio-button name=one-of-them> 
      <option selected>
        Credit card
        <on-selected>
          <open name=credit-card>
          <set name=way value=credit-card>
        </on-selected>

      <option> Cash
        <on-selected>
          <set name=way value="Cash">
        </on-selected>

      <option> Check
        <on-selected>
          <set name=way value="Check">
        </on-selected>

      <option disabled> I am not going to pay.
        <on-selected>
          <set name=way value="no-paying">
        </on-selected>
    </radio-button> 
  </window>

<rassi>

Hiermit können jedem Element eine oder mehrere Rassi-identifikators zu geordnet werden.

<redraw>

Hiermit wird das im Attribut name angegebene sichtbare Element neu angezeigt. Es löst kein rekursives Anzeigen an. Das neue Anzeigen eines Elementes, daß den status suspended or closed hat, bewirkt keine Veränderung. Status des Elementes bleibt gleich.
  <set name=image value="../images/summer.gif">
  <frame name=sport-presentation
    title="Summer Sport">
    <img name=sport-movie
      src=$image$
      format=gif>
  </frame> 
  <open name=sport-presentation>
  <set name=image value="../images/spring.gif">
  <redraw name=sport-presentation>

<registration-form>

Zur Aufnahme neuer Benutzer. Der Name der Registratur steht in name. In users kann der Name einer Kundendatenbank angegeben werden, in die der neue Kunde eingetragen wird.
  <registration-form name="my-registration-form"
    users="user-database">

<rewind-button>

Beschreibt einen Knopf, der einen Film ( video), eine Audiosequenz ( audio) oder eine Diashow ( slide-show) zurückspult. Die Aktionen, die nach Drücken der Maustaste erfolgen sollen, werden mit on-click beschrieben. Dem Knopf kann einen einen Namen mit name gegeben werden.

Für rewind-button können folgende Attribute angegeben werden:

  <video name=mode> 
    <play-button name=play
      xpos=0
      ypos=5>
      <img src=play.gif>
      <on-click>
        <-- play of video mode is made automatically -->
        <set name=play.invisible value=invisible>
        <set name=stop.invisible value=>
        <set name=pause.invisible value=>
      </on-click>

    <stop-button name=stop>
      <img src=stop.gif>
      <on-click>
        <set name=play.invisible value=>
        <set name=stop.invisible value=>
        <set name=pause.invisible value=invisible>
      </on-click>

    <pause-button name=pause>
      <img src=pause.gif>
      <on-click>
        <set name=play.invisible value=>
        <set name=stop.invisible value=invisible>
        <set name=pause.invisible value=invisible>
      </on-click>

    <forward-button name=fast-forward>
      <img src=ff.gif>
    </forward-button>

    <rewind-button name=rewind
      xpos=20
      ypos=5>
      <img src=rew.gif>
    </rewind-button>
  </video> 

<row>

Eine Zeile einer Tabelle besteht aus Zellen ( cell). Ist line gesetzt, so wird die Tabellenzeile von der folgenden durch eine Linie abgetrennt; dabei sind Einträge, die mehrere Zeilen umfassen sollen, zu beachten.

Für Tabellenzeilen können folgende Attribute angegeben werden:

 
  <tabular name=prices
    colspec="lcl"
    status=opened>
    <row line>
      <cell>Name</cell> <cell>Size</cell> <cell>Price</cell>
    </row>

    <row line>
      <cell>zapato</cell> <cell>35-40</cell> <cell>140</cell>
    </row>
           
    <row line>
      <cell>chaussure</cell> <cell>41-48</cell> <cell>160</cell>
    </row>
  </tabular>

<s>

Der enthaltene Text wird schräg (slanted) gedruckt.

Für dieses Element können folgende Attribute angegeben werden:

  <s>
    Lord Byron is only great as a poet; as soon as he reflects,
    he is a child.
  </s>

<scheme>

Es wird die Definition eines Datenbankschemas wiedergegeben. Der Name des Schemas steht in name. Die Tabellendeklarationen des Schemas werden im Inhalt durch table angegeben.

  <scheme>
    <table name="products"
      columns="code price desc image">
    <table name="customer"
      columns="id name desc address">
  </scheme>

<scribble>

Hiermit kann man Bilder verändern oder zeichnen. Dies wird durch Setzen und Löschen einzelner Bildpunkte (in einer Standardfarbe) realisiert.

Für dieses Element können folgende Attribute angegeben werden:

  <scribble name=drawing
    src=my-car.gif>

<search-form>

Die Suchmöglichkeiten in Datenbank werden gestaltet. Der Name des Suchformulars steht in name. In users kann der Name einer Datenbank angegeben werden, in der gesucht werden soll.
  <search-form name="my-search-form"
    entries="product-database">

<set>

Es wird ein Variablenwert verändert. Der Name der Variablen steht in name, der neue Wert in value oder (ausschließend) im Inhalt von set. Es ist nicht zugelassen, dem Attribut status eines Elementes einen neuen Wert zuzuweisen.
  <set name=dummy
       value=1>
  <set name=foo>
    <img src=img.gif>
  </set>

<shopping-bag>

Der Einkaufskorb. Sein Name steht in name. In orders kann der Name einer Warenkorbdatenbank angegeben werden, aus deren Daten die Warenübersicht erstellt wird.
  <shopping-bag name=my-shopping-bag
    orders="actual-orders">

<shopping-list>

Eine Einkaufsliste. Ihr Name steht in name. In orders kann der Name einer Warenkorbdatenbank angegeben werden, aus deren Daten die Einkaufsliste erstellt wird.
  <shopping-bag name=what-i-want-to-buy
    orders="actual-orders">

<slice>

Innerhalb einer Zeitlinie time-line werden hiermit die während eines Zeitabschnitts auszuführenden Befehle spezifiziert. Die Dauer eines Zeitabschnitts kann über das Attribut end-of individuell oder allgemein über das Attribut slice von time-line festgelegt werden. Die Bedeutung dieser Dauer ist dieselbe wie bei wait . Zusätzlich kann mit dem Attribut periodical ein Zeitabschnitt beliebig oft periodisch wiederholt werden, bis end-of erüllt ist.

  <time-line end-of=12s
    periodical
    slice=3s>
    <slice>
      <par>
        <open name=m>
      <par>
        <open name=n>
    <slice>
      <par>
        <close name=m>
      <par>
        <close name=n>
    <slice end-of=1s>
      <open name=o>
    <slice end-of=5s>
      <close name=o>
  </time-line>

<slide-show>

Hiermit werden Bildfolgen deklariert, die zu einer Diashow komponiert werden. Der Ablauf der slide-show wird mit Hilfe der folgenden Knöpfe realisiert: play-button, stop-button, pause-button, forward-button und rewind-button.

Für Bilderfolgen können zusätzlig folgende Attribute angegeben werden:

  <slide-show name=summer-slide-show
    src=../slides/presentation
    format=slide
    interval=0.5
    height=30
    width=40
    status=closed>

<slider-box>

Hiermit wird der mittlere verschiebbare Knopf eines horizontal-slider oder vertical-slider deklariert.
  <frame name=myframe elems="photo">
    $photo$
  </frame>

  <sql result=my-query>
    select image
    from   prod
    where  price < 1000
  </sql>

  <horizontal-slider name=prod-slider
    style=quelle
    height=21
    width=210
    layer=1
    step=2>
    <slider-previous>
      <img src=previous.gif>
    <slider-next>
      <img src=next.gif>
    <slider-box>
      <img src=box.gif> 
    <on-reposition>   
      <open name=myframe>
        <element name=photo>
          <img src=$myquery.photo[myslider.position]$
        </element>
      </open>
    </on-reposition>   
  </horizontal-slider>

<slider-next>

Hiermit wird der Zugriff auf ein kontextuell nachfolgendes Element eines horizontal-slider oder vertical-slider ermöglicht.
  <frame name=myframe elems="photo">
    $photo$
  </frame>

  <sql result=my-query>
    select image
    from   prod
    where  price < 1000
  </sql>

  <horizontal-slider name=prod-slider
    style=quelle
    height=21
    width=210
    layer=1
    step=2>
    <slider-previous>
      <img src=previous.gif>
    <slider-next>
      <img src=next.gif>
    <slider-box>
      <img src=box.gif> 
    <on-reposition>   
      <open name=myframe>
        <element name=photo>
          <img src=$myquery.photo[myslider.position]$
        </element>
      </open>
    </on-reposition>   
  </horizontal-slider>

<slider-previous>

Hiermit wird der Zugriff auf ein kontextuell vorhergehendes Element eines horizontal-slider oder vertical-slider ermöglicht.
  <frame name=myframe elems="photo">
    $photo$
  </frame>

  <sql result=my-query>
    select image
    from   prod
    where  price < 1000
  </sql>

  <horizontal-slider name=prod-slider
    style=quelle
    height=21
    width=210
    layer=1
    step=2>
    <slider-previous>
      <img src=previous.gif>
    <slider-next>
      <img src=next.gif>
    <slider-box>
      <img src=box.gif> 
    <on-reposition>   
      <open name=myframe>
        <element name=photo>
          <img src=$myquery.photo[myslider.position]$
        </element>
      </open>
    </on-reposition>   
  </horizontal-slider>

<small>

Der enthaltene Text wird mit verkleinerter Schriftart gedruckt.

Für dieses Element können folgende Attribute angegeben werden:

  <s>
    Ich kenne mich auch nicht und
    Gott soll mich auch davor behüten.
  </s>
  <small>
    Johann Wolfgang von Goethe
  </small>

<sql>

Es wird ein SQL-Statement ausgeführt. Die Anweisung wird in gewöhnlicher SQL-Syntax als Inhalt des Elements aufgeführt. Das Resultat kann als Tabelle in in einer in result anzugebenden Variable gespeichert werden.

  <sql result=my-query>
    SELECT image
    FROM products
    WHERE price<1000
  </sql>

<stop-button>

Beschreibt einen Knopf, der einen Film ( video), eine Audiosequenz ( audio) oder eine Diashow ( slide-show) stoppt. Die Aktionen, die nach Drücken der Maustaste erfolgen sollen, werden in on-click beschrieben. Dem Knopf kann mit name ein Name gegeben werden.

Für stop-button können folgende Attribute angegeben werden:

  <video name=mode> 
    <play-button name=play
      xpos=0
      ypos=5>
      <img src=play.gif>
      <on-click>
        <-- play of video mode is made automatically -->
        <set name=play.invisible value=invisible>
        <set name=stop.invisible value=>
        <set name=pause.invisible value=>
      </on-click>

    <stop-button name=stop>
      <img src=stop.gif>
      <on-click>
        <set name=play.invisible value=>
        <set name=stop.invisible value=>
        <set name=pause.invisible value=invisible>
      </on-click>

    <pause-button name=pause>
      <img src=pause.gif>
      <on-click>
        <set name=play.invisible value=>
        <set name=stop.invisible value=invisible>
        <set name=pause.invisible value=invisible>
      </on-click>

    <forward-button name=fast-forward>
      <img src=ff.gif>
    </forward-button>

    <rewind-button name=rewind
      xpos=20
      ypos=5>
      <img src=rew.gif>
    </rewind-button>
  </video> 

<strong>

Der enthaltene Text wird besonders betont, stärker als mit em.

Für dieses Element können folgende Attribute angegeben werden:

  <strong> 
    If I have seen further it is by standing on the shoulders of giants.
  </strong>
  <small>
    Letter to Robert Hooke, 5 Feb. 1675/6.
  </small>

<styles>

Im Stilteil werden für die Layoutobjekte Voreinstellungen ( stylesheet) vorgenommen.
  <styles>
    <stylesheet name=catalog-style>
      <default>
        <p lftmrg=1cm>
      </default>
    </stylesheet>
    <stylesheet name=my-catalog-style
      extends=catalog-style>
      <default>
        <p baselineskip=12pt>
      </default>
    </stylesheet>
  </styles>

<stylesheet>

In Stylesheets werden verschiedene Einzelvoreinstellungen für Layoutobjekte zusammengefaßt. Mit dem Attribut name werden sie benannt.

Stylesheets können Erweiterungen anderer sein. Das Attribut extends enthält eine Liste von Stylesheetnamen, deren Voreinstellungen übernommen werden. Dabei priorisieren zunächst Voreinstellungen in zuerst genannten Stylesheets solche in später genannten. Zusätzlich überladen Voreinstellungen im erweiternden Stylesheet die Voreinstellungen der in der Liste genannten Stylesheets. Voreinstellungen, die in default angegeben werden, priorisieren Voreinstellungen von Stylesheets.

Ebenso können die einzelnen Voreinstellungen modifiziert werden.

  <stylesheet name=my-catalog-style
              extends=catalog-style>
    <default extends=other-catalog-style>
      <p baselineskip=12pt>
    </default>
  </stylesheet>

<sub>

Die Grundlinie des enthaltenen Textes wird nach unten verlagert.

Für dieses Element können folgende Attribute angegeben werden:

  A<sub distance=1>11</sub><sup distance=1>t</sup> is the
  first element of the matrix transpose of A.

<sup>

Die Grundlinie des enthaltenen Textes wird nach oben verlagert.

Für dieses Element können folgende Attribute angegeben werden:

  A<sub distance=1>11</sub><sup distance=1>t</sup> is the
  first element of the matrix transpose of A.

<suspend>

Ein Prozess bzw. zeitabhängiges Element (im Attribut name) wird suspendiert (vorübergehend angehalten). Status des Elementes wird auf suspended gesetzt. Es kann mit open fortgesetzt oder mit close angehalten werden.
  <suspend name=video-1>

<table>

Zur Deklaration einer Tabelle eines Datenbankschemas. Mit name wird die Tabelle benannt, mit columns die zugehörigen Spalten deklariert, key umfaßt alle Spaltennamen, die den Schlüssel bilden.

  <scheme>
    <table name="products"
      columns="code price desc image">
    <table name="customer"
      columns="id name desc address">
  </scheme>

<table-of-contents>

Die Inhaltsübersicht. Sie wird automatisch aus der Themenstruktur ( theme) erstellt. Ihr Name wird in name angegeben.
  <table-of-contents name=my-table-of-contents>

<tabular>

Es wird eine neue Tabelle deklariert. Sie besteht aus Einträgen, cell genannt, die mit row zu Zeilen zusammengefaßt werden, aus denen dann wiederrum Tabellen aufgebaut sind.

Mit dem Attribut colspec kann die Darstellung der einzelnen Spalten (links, rechts, zentriert) kontrolliert werden. align bestimmt die Ausrichtung der Tabelle.

Für Tabellen können zusätzlig folgende Attribute angegeben werden:

  <tabular name=prices
    colspec="lcl"
    status=opened>
    <row line>
      <cell>Name</cell> <cell>Size</cell> <cell>Price</cell>
    </row>

    <row line>
      <cell>zapato</cell> <cell>35-40</cell> <cell>140</cell>
    </row>
           
    <row line>
      <cell>chaussure</cell> <cell>41-48</cell> <cell>160</cell>
    </row>
  </tabular>

<template>

Eine Formatvorlage wird durch Variablen mit Inhalten aus der in result gespeicherten Datenbanktabelle gefüllt. Die Layoutelemente sind in einer Seite ( page) oder Fenster ( window) beinhaltet. Es sollten Knöpfe zur Weiterverzweigung in eventuelle Unterthemen und Datenbankeinträge vorhanden sein.

Es wird implizit ein wait -Statement zum Abschluß eingefügt.

 <theme name=general>
   <extension result=general-result>
    <sql>
        SELECT name
        FROM database
    </sql>
    <template>
     <page name=general-page>
         <p>This is a $general-result.name$.</p>
        <next-button>
      </page>
    </template>
   </extension>
   <exceptions>
    <sql>
        SELECT name
        FROM database
        WHERE name=[AEIOU].*
    </sql>
    <template>
      <page name=general-exception-page>
           <p>This is an $general-result.name$.</p>
          <next-button>
      </page>
    </template>
   </exceptions>
 <theme=sub-general>
      ...
    </theme>
  </theme>

<term>

Ist die Beschreibung eines Markierungselements einer Liste ( listing oder itemize).

Für dieses Element können folgende Attribute angegeben werden:

  <itemize>
    <term>
      <img src=red-bullet.gif>
    </term>

    <item> First item
    <item> Second item
      ...
    <item> Last item
  </itemize>

  <listing>
    <term>
      <img src=first.gif>
    <item> First item

    <term>
      <img src=second.gif>
    <item> Second item
      ...  
    <term>
      <img src=last.gif>
    <item> Last item
  </listing>

<theme>

Themen dienen der Gliederung des Produktkatalogs. Ein Thema besteht aus

Ein Thema sollte mindestens durch eine Datenbankeintragdeklaration oder einen Unterthema definiert sein. Ein Thema wird mit open geöffnet und mit close geschlossen. Zur Navigation stehen next, previous, up, down und back zur Verfügung.

 <theme name=general>
   <extension result=general-result>
    <sql>
        SELECT name
        FROM database
    </sql>
    <template>
     <page name=general-page>
         <p>This is a $general-result.name$.</p>
        <next-button>
      </page>
    </template>
   </extension>
   <exceptions>
    <sql>
        SELECT name
        FROM database
        WHERE name=[AEIOU].*
    </sql>
    <template>
      <page name=general-exception-page>
           <p>This is an $general-result.name$.</p>
          <next-button>
      </page>
    </template>
   </exceptions>
 <theme=sub-general>
      ...
    </theme>
  </theme>

<time-line>

Mit einer Zeitlinie kann das gemeinsame zeitliche auch parallele Verhalten einer gewissen Menge von Elementen spezifiziert werden. Die Gesamtdauer dieses Verhaltens wird im Attribut end-of angegeben; fehlt diese Angabe, so ergibt sich die Dauer aus der Abarbeitungsgeschwindigkeit. Ist periodical gesetzt, so wiederholt sich das Zeitlinienverhalten periodisch.

Eine Zeitlinie wird mit dem Element slice in Abschnitte eingeteilt, die sequentiell durchlaufen werden. Die Dauer der Abschnitte kann allgemein über das Attribut slice bestimmt werden oder aber individuell für jede Zeitscheibe. Innerhalb einer mit slice abgegrenzten Zeitscheibe werden die durch par getrennten Teile parallel zueinander ausgeführt.

  <time-line end-of=12s
    periodical
    slice=3s>
    <slice>
      <par>
        <open name=m>
      <par>
        <open name=n>
    <slice>
      <par>
        <close name=m>
      <par>
        <close name=n>
    <slice end-of=1s>
      <open name=o>
    <slice end-of=5s>
      <close name=o>
  </time-line>

<tt>

Für den enthaltenen Text wird Schreibmaschinendruck (tele type)gewählt.

Für dieses Element können folgende Attribute angegeben werden:

  <i>
    So leben wir und nehmen immer Abschied.
  </i>
  <tt>
    Rainer Maria Rilke
  </tt>

<u>

Die enthaltenen Elemente werden unterstrichen.

Für dieses Element können folgende Attribute angegeben werden:

  <s>
    That ideal reader suffering from an ideal insomnia.
  </s> 
  <u>
    James Joyce
  </u>

<up>

Damit erreicht man das erste Oberthema theme in Bezug auf das aktuelle. Ist das aktuelle Thema das oberste, so ist dies ein Fehler.

Das aktuelle Thema wird in einer History gespeichert.

Der Kontrollfluß verzweigt zum ersten Oberthema.

  <button name=up
    xpos=10 ypos=10>
    Go up the hierachy.
    <img src=up.gif>
    <on-click>
      <up>
    </on-click>
  </button>

<var>

Es wird eine neue, eventuell lokale Variable deklariert. Ihr Name wird in name angegeben, ihr Wert in value. Ausschließend alternativ kann der Wert im Inhalt von var angegeben werden (das Endetag muß dann vorhanden sein).

Der Wert einer Variablen kann mit set geändert werden.

Auf Variablen wird, sowohl in Attributen als auch im Inhalt, mit $name$ zugegriffen. Soll $ buchstäblich vorkommen, so ist es mit \ zu eskapieren.

Einige Namen sind reserviert:

Es gilt das Prinzip der statischen Bindung.

  <var name=months value=12>
  <var name=pic>
    <img src=pic.gif>
  </var>
  <var name=dummy value=$months$\$>
  <var name=foo>
    $pic$
    $pic$
  </var>

<variant>

Hiermit können Varianten fü Attributen definiert werden, die zu entsprechend viele Variationen eines Katalogs führen. Jede variant kann mit name eindeutig Identifiziert werden. Das Element, dessen Attribute variiert werden sollen, wird in object angegeben, das Attribut in attribute und einen der Werte in value. Zusätzliche Werte, Attribute und Elemente zu dieser Variante werden mit and und Alternativen mit or angegeben.
 <variant name=a object=windowA> 

      <element name=text>
          hello World !
      </element>							 	           			                      							        	              
      <and  attribute=background value="blue">
      </and>

   <and object=windowB>

      <element name=text>
          hallo Welt !
      </element>
      <and  attribute=background  value="red">
      </and>
    </and>
							 	           		    
    <or name=b object=windowA attribute=background value="green">
        < and>
           < element name=text>
                   hallo Welt !
           </element>
        </and>
      < and  object=windowB attribute=background  value="yellow">
         < and>
           < element name=text>
                   hello World !
           </element>							 	     
   </variant>

<vertical-slider>

Vertikale Schiebeelemente dienen zur Steuerung komplexerer (vertikaler) Auswahl- und Anwahlstrukturen. In der Mitte des Scrollbars befindet sich ein verschiebbarer Knopf, slider-box>, oben der slider-previous-Knopf, um den Zugriff auf ein kontextuell vorhergendes Element zu ermöglichen, unten der slider-next-Knopf, um nachfolgende Elemente zu erreichen. Dadurch wird auch die Stellung des Mittelknopfes beeinflußt.

Für Sliders können folgende Attribute angegeben werden:

  <frame name=myframe elems="photo">
    $photo$
  </frame>

  <sql result=my-query>
    select image
    from   prod
    where  price < 1000
  </sql>

  <vertical-slider name=prod-slider
    style=quelle
    height=21
    width=210
    layer=1
    step=2>
    <slider-previous>
      <img src=previous.gif>
    <slider-next>
      <img src=next.gif>
    <slider-box>
      <img src=box.gif> 
    <on-reposition>   
      <open name=myframe>
        <element name=photo>
          <img src=$myquery.photo[myslider.position]$
        </element>
      </open>
    </on-reposition>   
  </vertical-slider>

<video>

Hiermit werden Filme angegeben. Der Ablauf des Filmes wird mit Hilfe der folgenden Knöpfe realisiert: play-button, stop-button, pause-button, forward-button und rewind-button.

Für Videofilme können zusätzlig folgende Attribute angegeben werden:

  <video name=summer-video
    src=/videos/summer-video.mov
    format=mov
    status=opened>

<window>

Fenster sind Rahmen, die zusätlich beweglich, in der Grösse veränderbar und auch temporär schließbar sind.

Ein Fenster kann folgende Attribute haben:

  <window name=summer-sport-presentation
    title="SUMMER SPORT"
    xpos=10
    ypos=10
    width=400
    height=200
    lftpad=25
    rgtpad=25
    toppad=25
    botpad=25>
    <img src=summer-logo.gif>
    Welcome to the Summer Sport Catalogue '96!
    <video name=summer-video
      src=/videos/summer-video.mov
      format=mov
      status=opened>
    <button
      style=sport-style>
      Go for it!
      <on-click>
        <close name=summer-video>
        <close name=summer-sport-presentation>
        <open name=summer-sport>
      </on-click>
    </button>
  </window>

epkml DTD