Das im Folgenden kurz vorgestellte Projekt »epubMinFlow« soll den technologischen Prozess der Produktion von E-Books auf der Basis des populären EPUB-Formates unter Verwendung von XML zur Datenhaltung und XSLT 2.0 zur Produktion demonstrieren. Es wurde im Rahmen von Lehrveranstaltungen und weiteren Publikationen des Autors konzipiert und umgesetzt.
von Dr. Thomas Meinike – 04/2010
Zu den EPUB-Grundlagen sei an dieser Stelle lediglich auf die IDPF-Spezifikationen, den kompakten Wikipedia-Artikel und ein bemerkenswertes Video verwiesen. Ziel des Projektes ist die automatisierte Umsetzung von elektronischen Büchern ausgehend von einer einfachen XML-Buchstruktur. Dazu wurden Datenmodelle wahlweise als Document Type Definition (buch.dtd) und XML-Schema (buch.xsd) entworfen. In einem darauf aufbauenden Buch lassen sich neben den benötigten Metadaten die eigentlichen Inhalte in Kapiteln und Abschnitten ablegen. Zusätzlich können Bilder, Stylesheets (CSS) und Font-Dateien einbezogen werden.
Die Produktion der EPUB-Archive wird über ein Windows-basiertes Konsolenskript (go.cmd) gesteuert. Darin werden zunächst die benötigten Zusatzdateien und Pfade festgelegt. Danach wird ein später zu packendes Verzeichnis mit Unterverzeichnissen erzeugt. Es schließt sich ein XSLT 2.0-Transformationsschritt an (Code in epub.xsl), welcher das exemplarische Dokument buch.xml in die vom EPUB-Standard vorgegebene Zielstruktur mit allen erforderlichen Steuer- und Inhaltsdateien überführt. Danach folgt der ZIP-Kompressionsschritt zum fertigen E-Book (buch.epub). Abschließend wird eine Konsistenz- bzw. Konformitätsprüfung mit frei verfügbaren Testwerkzeugen vorgenommen.
Zum Nachvollziehen werden diese frei zugänglichen Softwarekomponenten benötigt:
XML-Buchinstanzen von buch.dtd bzw. alternativ buch.xsd erlauben die Verwendung eines vereinfachten Satzes an Strukturelementen (Abbildung 1 veranschaulicht die zugrunde gelegte Dokumentstruktur, detaillierter als separate Schema-Übersicht verfügbar):
Abb. 1: Einblick in die Document Type Definition buch.dtd
Das XSLT-Stylesheet epub.xsl setzt die relevanten Inhalte nach XHTML 1.1 um und erzeugt unter Nutzung von xsl:result-document pro Kapitel ein Ausgabedokument:
<!-- Kapitelinhalte als XHTML-Dateien ausgeben --> <xsl:template match="kapitel"> <xsl:result-document href="{$epubdir}/{$opsdir}/{$htmldir}/kapitel{fn:position()}.html" format="xhtml11"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="{if(/buch/metadaten/sprache) then /buch/metadaten/sprache else 'en'}"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> <meta name="description" content="EPUB - Kapitel {fn:position()}" /> <link rel="stylesheet" type="text/css" href="../{$cssdir}/{/buch/dateien/datei[@id='stylesheet']/@name}" /> <title><xsl:value-of select="@titel"/></title> </head> <body> <h1><xsl:value-of select="@titel"/></h1> <xsl:apply-templates select="abschnitt"/> </body> </html> </xsl:result-document> </xsl:template>
Zur Nutzung des Batchjobs sind ggf. Anpassungen in go.cmd vorzunehmen, insbesondere beim Dateinamen des zu verarbeitenden XML-Dokuments (Vorgabe buch.xml) und bezüglich der absoluten Pfade zu den verwendeten Programmen:
~~~ (1) ~~~ rem Ausgangsdokumente (XML bzw. XSLT): set xmlfile=buch.xml set xslfile=epub.xsl rem Programmpfade zu ZIP-Tool, XSLT-Prozessor, EPUB-Checktools rem [Aufrufparameter ggf. unter (2) anpassen]: set ziptool="X:\Pfad_zu\Info-ZIP\zip.exe" set xsltprz="X:\Pfad_zu\Saxon\saxon9he.jar" set epcheck="X:\Pfad_zu\EpubCheck\epubcheck-1.2.jar" set epprefl="X:\Pfad_zu\EpubPreflight\epubpreflight-0.1.0.jar" ~~~ (2) ~~~ rem EPUB-Inhalte mittels XSLT 2.0-Job aus XML-Buchdokument erzeugen rem (container.xml, content.opf, toc.ncx, einzelne XHTML-Dokumente): echo. echo * XSLT-Prozess ... java -jar %xsltprz% -s:%xmlfile% -xsl:%xslfile% rem Erzeugten Verzeichnisinhalt in *.epub packen: echo. echo * Kompression ... echo. cd %epubdir% %ziptool% -0X ..\%epubfile%.epub mimetype %ziptool% -9XDr ..\%epubfile%.epub %metadir% %opsdir% cd.. ...
Bei alternativer Nutzung von AltovaXML / Intel SOA Expressway / XQSharp für den Transformationsschritt sind diese angepassten Zeilen zu verwenden:
set xsltprz="X:\Pfad_zu\AltovaXML\AltovaXML.exe" ... %xsltprz% -in %xmlfile% -xslt2 %xslfile% ~~~~~~~~~~~ set xsltprz="X:\Pfad_zu\IntelSOAExpressway\soaexslt2.exe" ... %xsltprz% %xslfile% %xmlfile% ~~~~~~~~~~~ set xsltprz="X:\Pfad_zu\XQSharp\XSLT.exe" ... %xsltprz% -s %xmlfile% %xslfile%
Zur Ausführung der Java-basierten Komponenten wird zusätzlich eine aktuelle Java-Laufzeitumgebung (JRE) benötigt.
Ein typischer Testlauf erzeugt nach dem erfolgreichen Ausführen von go.cmd diese Konsolenausgabe:
X:\epubMinFlow>go EPUB-Build-Prozess gestartet ... * Vorbereitung ... style\page-template.xpgt style\standard.css 2 Datei(en) kopiert. bilder\cover.jpg bilder\ereader.png bilder\grafik.svg bilder\pizza.jpg 4 Datei(en) kopiert. fonts\Delicious-Roman.otf fonts\Tallys_15.otf 2 Datei(en) kopiert. * XSLT-Prozess ... Wrote X:\epubMinFlow\epub/META-INF/container.xml Wrote X:\epubMinFlow\epub/OPS/content.opf Wrote X:\epubMinFlow\epub/OPS/toc.ncx Wrote X:\epubMinFlow\epub/OPS/html/buchcover.html Wrote X:\epubMinFlow\epub/OPS/html/inhalt.html Wrote X:\epubMinFlow\epub/OPS/html/kapitel1.html Wrote X:\epubMinFlow\epub/OPS/html/kapitel2.html Wrote X:\epubMinFlow\epub/OPS/html/kapitel3.html Wrote X:\epubMinFlow\epub/OPS/html/kapitel4.html * Kompression ... adding: mimetype (stored 0%) adding: META-INF/container.xml (deflated 32%) adding: OPS/bilder/cover.jpg (deflated 3%) adding: OPS/bilder/ereader.png (deflated 0%) adding: OPS/bilder/grafik.svg (deflated 63%) adding: OPS/bilder/pizza.jpg (deflated 0%) adding: OPS/content.opf (deflated 71%) adding: OPS/fonts/Delicious-Roman.otf (deflated 43%) adding: OPS/fonts/Tallys_15.otf (deflated 18%) adding: OPS/html/buchcover.html (deflated 39%) adding: OPS/html/inhalt.html (deflated 52%) adding: OPS/html/kapitel1.html (deflated 48%) adding: OPS/html/kapitel2.html (deflated 50%) adding: OPS/html/kapitel3.html (deflated 44%) adding: OPS/html/kapitel4.html (deflated 60%) adding: OPS/style/page-template.xpgt (deflated 79%) adding: OPS/style/standard.css (deflated 56%) adding: OPS/toc.ncx (deflated 73%) ... EPUB (buch.epub) wurde erzeugt. * EPUB-Tests ... Epubcheck Version 1.2 No errors or warnings detected EpubPreflight Version 0.1.0 No errors or warnings detected
Das bei jedem Lauf neu erzeugte Ausgabeverzeichnis epub enthält die letztlich in buch.epub verpackte Dateistruktur:
– epub mimetype – META-INF container.xml – OPS content.opf toc.ncx + bilder + fonts + html + style
Im Testbuch kommt in den Kapitel 1 bis 3 vorwiegend Blindtext zum Einsatz (vgl. Abbildungen 2 bis 5), während das vierte Kapitel die zusätzlichen Techniken in Aktion zeigt.
Abb. 2: Testbuchansicht mit Adobe Digital Editions
Abb. 3: Testbuchansicht mit SONY-Reader PRS-505
Abb. 4: Testbuchansicht mit Stanza auf Apple iPhone
Abb. 5: Testbuchansicht mit iBooks auf Apple iPad
Hinweis: Die eingebundenen freien Schriftarten »Delicious-Roman.otf« und »Tallys_15.otf« stammen von Jos Buivenga (exljbris Font Foundry).
Das vorliegende Projekt stellt den (funktionierenden) Prototyp zur Demonstration eines EPUB-Workflows dar. Dennoch lassen sich unter Verwendung der möglichen Strukturelemente bereits komplette E-Books erzeugen. Mehr Funktionalität lässt sich durch Anpassungen im XSLT-Stylesheet (epub.xsl) erzielen. Weitere Details zur gewählten Umsetzung liefert das Studium des Quellcodes.
Die aktuelle Projektversion steht für eigene Tests zur Verfügung. Ihre Weiterverbreitung ist nur mit Quellenangabe erlaubt.
Versionsstand: 1.5 (2011-08-19) | Letzte Aktualisierung dieses Dokuments: 2017-11-11
Logo-Quelle: IDPF (EPUB Logo Contest)