Digitale Bücher im Format EPUB selbst erstellen: Fallunterscheidung bei Dateninseln

Wer einen Fehler gemacht hat und nicht korrigiert,
begeht einen zweiten.
Konfuzius

Kurzanleitung

Inhalt

In XHTML-Dokumenten und SVG-Dokumenten können Fragmente aus anderen XML-Formaten integriert werden, sogenannte Dateninseln. SVG definiert dafür bereits eine geeignete Syntax und Elemente, in denen solche Fragmente notiert werden dürfen.
Für XHTML und SVG definiert EPUB im Namensraum von OPS ('http://www.idpf.org/2007/ops') spezielle Elemente, um sicherzustellen, daß für das Fragment angemessene Alternativen bereitgestellt werden.
Dieser Mechanismus entspricht weitgehend dem von switch in SVG, allerdings mit speziellen zusätzlichen Gruppierungselementen. Ferner ist damit leider auch keine Sprachauswahl möglich.

Für Dateninseln in einem erforderlich zu interpretierenden Format wie DTB oder SVG sieht EPUB keinen besonderen Mechanismus vor.

OPS-Elemente

EPUB definiert die Elemente switch, case und default.
Dort, wo ein fremdes Fragment eingebettet werden soll, wird switch notiert. Als Kindelemente sind optionale case-Elemente zu notieren, die alternative Fragmente darstellen. Als letzte Alternative ist exakt ein Element default anzugeben.

Element switch

Außer als Behälter für die genannten Elemente case und default dient das Element vorrangig dazu, den Mechanismus zur Auswahl einer Alternative aus den Kindelementen zu aktivieren. Die erste für das Darstellungsprogramm akzeptable Alternative wird zur Präsentation gewählt. Die anderen Alternativen werden nicht präsentiert.

Optional kann ein Attribut id bei switch notiert werden. EPUB gibt keine weiteren Informationen darüber, man darf aber wohl annehmen, daß es die Funktion eines Fragmentidentifizierers hat.

Element case

switch kann beliebig viele Elemente case enthalten. Ein Element case dient als Behälter für eine alternative XML-Dateninsel. case kann aber außerdem oder stattdessen auch weitere Elemente switch enthalten, etwa um mehr als einen Namenraum zu testen.

Erforderlich ist für case die Angabe des Attributes required-namespace. Der Wert ist der Namensraum eines XML-Formates, welches interpretiert werden muß, um den Inhalt präsentieren zu können. Damit ist nicht gesagt, daß alle Kindelemente von case zum geprüften Namensraum gehören müssen.
EPUB schließt auch nicht aus, daß das Attribut leer ist, dann also wohl immer einen positiven Testwert liefert.

Falls das im folgenden Absatz erläuterte Attribut required-modules nicht gesetzt oder nicht anwendbar ist:
Wird der in required-namespace notierte Namensraum interpretiert, so wird diese Alternative zur Präsentation ausgewählt, sonst wird das nächste Kindelement von switch auf Eignung geprüft.

Ein optionales weiteres Attribut ist required-modules. Dies kann bei einem modularisierten Format verwendet werden, um Module anzugeben, die für eine Präsentation erforderlich sind. Ist das Format nicht modularisiert, so ist das Attribut nicht anwendbar.
Der Wert ist eine Liste der erforderlichen Module. Werden alle gelisteten Module des mit required-namespace angegebenen Namensraumes interpretiert, so wird der Inhalt von case als Alternative zur Präsentation ausgewählt, sonst wird das nächste Kindelement von switch auf Eignung geprüft.

required-modules kann auch verwendet werden, um jene Module von XHTML zu testen, die gemäß EPUB nicht erforderlich darstellbar sind.

Optional kann ein Attribut id bei case notiert werden. EPUB gibt keine weiteren Informationen darüber, man darf aber wohl annehmen, daß es die Funktion eines Fragmentidentifizierers hat.

Element default

default ist immer das letzte Kindelement von switch. Außer optionalen weiteren Elementen switch enthält das Element Kindelemente aus einem Namensraum, der gemäß EPUB interpretiert werden muß. Außerdem ist der Inhalt so zu wählen, daß er in dem Namensraum des Elternelementes von switch an der Stelle erlaubt ist, wo switch steht.

Optional kann ein Attribut id bei default notiert werden. EPUB gibt keine weiteren Informationen darüber, man darf aber wohl annehmen, daß es die Funktion eines Fragmentidentifizierers hat.

Der so umgesetzte Mechanismus stellt folglich sicher, daß auf jeden Fall eine der angegebenen Alternativen interpretiert werden kann - jedenfalls erlaubt es dieser Mechanismus einem Autor, dies umzusetzen.

Wenn eine angegebene Stilvorlage ausreicht, um den fremden Inhalt angemessen zu repräsentieren, reicht es offenbar, diesen in einem case mit einem interpretierten Namensraum als Testkriterium zu notieren. Gemäß EPUB wäre es hingegen falsch, den fremden Inhalt direkt im default zu notieren. Das ist natürlich nicht besonders gut durchdacht und nimmt den Autoren mehr Verantwortung für die Zugänglichkeit aus der Hand als notwendig.

Beispiele

Folgendes ist ein Beispiel für ein XHTML-Fragment, in welchen dieser Mechanismus verwendet wird, um eine Dateninsel im Format LML [LML] einzubinden:

<div class="lml">
<switch xmlns="http://www.idpf.org/2007/ops">
<case required-namespace="http://purl.oclc.org/net/hoffmann/lml/">
  <literature version="1.0" xml:lang="de"
              xmlns="http://purl.oclc.org/net/hoffmann/lml/">
    <!-- ... Irgendein literarischer Inhalt in LML umgesetzt -->
  </literature>
</case>
<default>
  <dtbook xmlns="http://www.daisy.org/z3986/2005/dtbook/" 
          version="2005-3" xml:lang="de">
    <!-- ... der gleiche Inhalt alternativ als DTB umgesetzt -->     
  </dtbook> 
</default>
</switch>
</div>

Oder mit SVG als Alternative:

<div class="lml">
<switch xmlns="http://www.idpf.org/2007/ops">
<case required-namespace="http://purl.oclc.org/net/hoffmann/lml/">
  <literature version="1.0" xml:lang="de"
              xmlns="http://purl.oclc.org/net/hoffmann/lml/">
    <!-- ... Irgendein literarischer Inhalt in LML umgesetzt -->
  </literature>
</case>
<default>
  <svg xmlns="http://www.w3.org/2000/svg"
     xmlns:xlink="http://www.w3.org/1999/xlink"
     version="1.1" 
     xml:lang="de"
     width="100%" height="100%" 
     viewBox="-500 -500 1000 1000">
   <!-- ... Irgendein literarischer Inhalt in SVG umgesetzt -->  
  </svg>
</default>
</switch>
</div>

Oder mit XHTML als Alternative:

<div class="lml">
<switch xmlns="http://www.idpf.org/2007/ops">
<case required-namespace="http://purl.oclc.org/net/hoffmann/lml/">
  <literature version="1.0" xml:lang="de"
              xmlns="http://purl.oclc.org/net/hoffmann/lml/">
    <!-- ... Irgendein literarischer Inhalt in LML umgesetzt -->
  </literature>
</case>
<default>
<div xmlns="http://www.w3.org/1999/xhtml"
      xml:lang="de">
   <!-- ... Irgendein literarischer Inhalt in XHTML umgesetzt -->   
</div>
</default>
</switch>
</div>

Auch wenn der umgebende Inhalt bereits XHTML ist, darf man bei obiger Variante keinesfalls vergessen, den Namensraum erneut zu notieren. Möchte man das nicht, wäre der OPS-Namensraum mit einem Präfix anzugeben, etwa so:

<div class="lml" xmlns:ops="http://www.idpf.org/2007/ops">
<ops:switch>
<ops:case required-namespace="http://purl.oclc.org/net/hoffmann/lml/">
  <literature version="1.0" xml:lang="de"
              xmlns="http://purl.oclc.org/net/hoffmann/lml/">
    <!-- ... Irgendein literarischer Inhalt in LML umgesetzt -->
  </literature>
</ops:case>
<ops:default>
<div>
   <!-- ... Irgendein literarischer Inhalt in XHTML umgesetzt -->   
</div>
</ops:default>
</ops:switch>
</div>

Sofern die Stilvorlage für das umgebende XHTML-Dokument passende Selektoren enthält, um die enthaltenen fremden XML-Dokumente angemessen zu präsentieren, geht es offenbar auch wie im folgenden Beispiel, wobei willentlich eine in diesem Falle unsinnige Einschränkung von EPUB ignoriert wird. Eigentlich ist in solch einem Falle natürlich das komplette switch unnötig.

<div class="lml">
<switch xmlns="http://www.idpf.org/2007/ops">
<default>
  <div>
  <literature version="1.0" xml:lang="de"
              xmlns="http://purl.oclc.org/net/hoffmann/lml/">
    <!-- ... Irgendein literarischer Inhalt in LML umgesetzt -->
  </literature>
  </div>
</default>
</switch>
</div>

Und vielleicht geht es auch so (das ist nicht mit existierenden Darstellungsprogrammen getestet, aber von EPUB auch nicht ausgeschlossen):

<div class="lml">
<switch xmlns="http://www.idpf.org/2007/ops">
<case required-namespace="">
  <literature version="1.0" xml:lang="de"
              xmlns="http://purl.oclc.org/net/hoffmann/lml/">
    <!-- ... Irgendein literarischer Inhalt in LML umgesetzt -->
  </literature>
</case>
<default />
</switch>
</div>

Sicherer ist vermutlich folgende Variante:

<div class="lml">
<switch xmlns="http://www.idpf.org/2007/ops">
<case required-namespace="http://www.w3.org/1999/xhtml">
  <literature version="1.0" xml:lang="de"
              xmlns="http://purl.oclc.org/net/hoffmann/lml/">
    <!-- ... Irgendein literarischer Inhalt in LML umgesetzt -->
  </literature>
</case>
<default />
</switch>
</div>

Soll ein Modul von XHTML eingebunden werden, welches nicht erforderlich interpretierbar ist, könnte das sinngemäß so aussehen:

<div class="iframe">
<switch xmlns="http://www.idpf.org/2007/ops">
<case required-namespace="http://www.w3.org/1999/xhtml"
      required-modules="iframe,target">
  <div xmlns="http://www.w3.org/1999/xhtml"
       xml:lang="de">
    <!-- ... Irgendein Inhalt, bei dem man zum Beispiel 
         einen deutschen Text in einem iframe mit einer 
         Übersetzung in einem zweiten iframe vergleicht.
         Mit einem Verweis mit Attribut target kann man 
         dort andere Übersetzungen reinladen.
    -->
  </div>
</case>
<default>
  <div xmlns="http://www.w3.org/1999/xhtml"
       xml:lang="de">     
    <!-- Alternative, wo alle Übersetzungen in einem 
         Dokument stehen und der Vergleich ähnlich
         mit CSS simuliert wird.
    -->
  </div>
</default>
</switch>
</div>

Literaturangaben