XSLT-2.0-Code in »epub3.xsl« zum Projekt »Diskografie«

001 <?xml version="1.0" encoding="UTF-8"?>
002 <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
003   xmlns:fn="http://www.w3.org/2005/xpath-functions"
004   xmlns:xs="http://www.w3.org/2001/XMLSchema"
005   xmlns:tm="http://www.datenverdrahten.de/tm"
006   xmlns:epub="http://www.idpf.org/2007/ops"
007   xmlns="http://www.w3.org/1999/xhtml"
008   exclude-result-prefixes="fn tm xs">
009 
010   <!-- Author: T. Meinike 2012 / epub3.xsl - Ausführung über run.cmd
011        EPUB3-Anpassung von epub.xsl zum Tutorial http://www.tekom.de/upload/3383/OTS11_Meinike.pdf -->
012 
013   <!-- Globale Vorgaben - variable IDs, Dateinamen und Pfade -->
014   <xsl:variable name="bookid" select="'BookId'"/>
015   <xsl:variable name="contentfile" select="'content.opf'"/>
016   <xsl:variable name="tocfile" select="'toc.html'"/>
017   <xsl:variable name="ncxfile" select="'toc.ncx'"/>
018   <xsl:variable name="oldtoc" select="1"/><!-- toc.ncx zusätzlich ausgeben: Wert auf 1 setzen -->
019   <xsl:variable name="epubdir" select="'ausgabe'"/>
020   <xsl:variable name="opsdir" select="'OPS'"/>
021   <xsl:variable name="imgdir" select="'bilder'"/>
022   <xsl:variable name="cssdir" select="'style'"/>
023   <xsl:variable name="htmldir" select="'html'"/>
024   <xsl:variable name="coverid" select="'katalogcover'"/>
025   <xsl:variable name="stylesheet" select="'style.css'"/>
026   <xsl:variable name="ident" select="'http://example.net/diskografie'"/>
027 
028   <!-- externe Funktionen einbinden -->
029   <xsl:include href="../FktLib/library.xsl"/>
030 
031   <!-- Ausgabeformate zur Dateierzeugung über xsl:result-document -->
032   <xsl:output name="plaintext" method="text" encoding="UTF-8" indent="no" media-type="text/plain"/>
033 
034   <xsl:output name="stdxml" method="xml" version="1.0" encoding="UTF-8" indent="yes" media-type="text/xml"/>
035 
036   <xsl:output name="tocncx" method="xml" version="1.0" encoding="UTF-8" indent="yes" media-type="text/xml"
037     doctype-public="-//NISO//DTD ncx 2005-1//EN" doctype-system="http://www.daisy.org/z3986/2005/ncx-2005-1.dtd"/>
038 
039   <xsl:output name="xhtml5" method="xml" version="1.0" encoding="UTF-8" media-type="application/xhtml+xml" indent="yes"/>
040 
041 
042   <!-- Basis-Template -->
043   <xsl:template match="diskografie">
044 
045     <!-- EPUB-Struktur: mimetype (Pflicht) auf oberster Ebene -->
046     <xsl:result-document href="{$epubdir}/mimetype" format="plaintext">
047       <xsl:text>application/epub+zip</xsl:text>
048     </xsl:result-document>
049 
050 
051     <!-- EPUB-Struktur: container.xml in META_INF (beide Namen sind obligatorisch) -->
052     <xsl:result-document href="{$epubdir}/META-INF/container.xml" format="stdxml">
053       <container version="1.0" xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
054 
055         <rootfiles>
056           <rootfile full-path="{$opsdir}/{$contentfile}" media-type="application/oebps-package+xml"/>
057         </rootfiles>
058 
059       </container>
060     </xsl:result-document>
061 
062 
063     <!-- EPUB-Struktur: content.opf in OPS (beide Namen sind variabel) -->
064     <xsl:result-document href="{$epubdir}/{$opsdir}/{$contentfile}" format="stdxml">
065       <package xmlns="http://www.idpf.org/2007/opf" unique-identifier="{$bookid}" version="3.0">
066 
067         <metadata xmlns:dc="http://purl.org/dc/elements/1.1/">
068           <!-- Pflichtangaben -->
069           <dc:identifier id="{$bookid}"><xsl:value-of select="$ident"/></dc:identifier>
070           <dc:title><xsl:value-of select="fn:concat('Diskografie / ', @bandname)"/></dc:title>
071           <dc:language>de</dc:language>
072 
073           <!-- optionale Angaben -->
074           <dc:creator>T. Meinike 2012 / epub3.xsl</dc:creator>
075           <dc:publisher>T. Meinike</dc:publisher>
076           <dc:subject>Katalog</dc:subject>
077           <dc:date><xsl:value-of select="format-date(fn:current-date(), '[Y0001]-[M01]-[D01]')"/></dc:date>
078           <dc:description>Informationen zu Band-Veröffentlichungen</dc:description>
079 
080           <!-- Referenz auf das Coverbild -->
081           <meta name="cover" content="coverimage"/>
082 
083           <!-- zusätzliche Datumsangabe lt. EPUB3 -->
084           <meta property="dcterms:modified"><xsl:value-of select="format-dateTime(fn:adjust-dateTime-to-timezone(fn:current-dateTime(), xs:dayTimeDuration('PT0H')), '[Y0001]-[M01]-[D01]T[H01]:[m01]:[s01]Z')"/></meta>
085 
086         </metadata>
087   
088         <manifest>
089           <!-- Basis- und Zusatzdateien: TOC, NCX, CSS, Titelbild, ... -->
090           <item id="toc" properties="nav" href="{$tocfile}" media-type="application/xhtml+xml"/>
091           <xsl:if test="$oldtoc = 1">
092             <item id="ncx" href="{$ncxfile}" media-type="application/x-dtbncx+xml"/>
093           </xsl:if>
094           <item id="coverimage" properties="cover-image" href="bilder/{$coverid}.jpg" media-type="image/jpeg"/>
095           <item id="stern" href="{$imgdir}/stern.gif" media-type="image/gif"/>
096           <item id="css" href="{$cssdir}/{$stylesheet}" media-type="text/css"/>
097 
098           <!-- Coverbilder -->
099           <xsl:for-each select="werk/coverbild">
100             <item id="bild{fn:position()}" href="{fn:concat($imgdir, '/', .)}">
101               <xsl:attribute name="media-type">
102                 <xsl:choose>
103                   <xsl:when test="fn:contains(., '.gif')">image/gif</xsl:when>
104                   <xsl:when test="fn:contains(., '.jpg')">image/jpeg</xsl:when>
105                   <xsl:when test="fn:contains(., '.png')">image/png</xsl:when>
106                   <xsl:when test="fn:contains(., '.svg')">image/svg+xml</xsl:when>
107                 </xsl:choose>
108               </xsl:attribute>
109             </item>
110           </xsl:for-each>
111 
112           <item id="katalogcover" media-type="application/xhtml+xml" href="{$htmldir}/katalogcover.html"/>
113 
114           <xsl:if test="fn:string-length(bandinfo) > 0 or referenzen">
115             <item id="kap_infos" media-type="application/xhtml+xml" href="{$htmldir}/kapitel_infos.html"/>
116           </xsl:if>
117 
118           <!-- XHTML-Kapitel -->
119           <xsl:for-each select="werk">
120             <xsl:sort select="@jahr" order="ascending" data-type="number"/>
121             <item id="kap_werk_{fn:position()}" media-type="application/xhtml+xml" href="{$htmldir}/kapitel_werk_{fn:position()}.html"/>
122           </xsl:for-each>
123         </manifest>
124 
125         <spine>
126           <!-- toc="ncx" nur, wenn auch die alte TOC zusätzlich verwendet wird -->
127           <xsl:if test="$oldtoc = 1">
128             <xsl:attribute name="toc">
129               <xsl:text>ncx</xsl:text>
130             </xsl:attribute>          
131           </xsl:if>
132 
133           <itemref idref="katalogcover" linear="no"/>
134 
135           <xsl:if test="fn:string-length(bandinfo) > 0 or referenzen">
136             <itemref idref="kap_infos"/>
137           </xsl:if>
138 
139           <xsl:for-each select="werk">
140             <xsl:sort select="@jahr" order="ascending" data-type="number"/>
141             <itemref idref="kap_werk_{fn:position()}"/>
142           </xsl:for-each>
143         </spine>
144 
145         <guide>
146           <reference type="cover" title="buchcover" href="{$htmldir}/katalogcover.html"/>
147 
148           <xsl:if test="fn:string-length(bandinfo) > 0 or referenzen">
149             <reference type="text" title="Informationen" href="{$htmldir}/kapitel_infos.html"/>
150           </xsl:if>
151 
152           <xsl:for-each select="werk">
153             <xsl:sort select="@jahr" order="ascending" data-type="number"/>
154             <reference type="text" title="{werkname}" href="{$htmldir}/kapitel_werk_{fn:position()}.html"/>
155           </xsl:for-each>
156         </guide>
157 
158       </package>
159     </xsl:result-document>
160 
161 
162     <!-- EPUB-Struktur: neue HTML5-TOC toc.html im Verzeichnis OPS (beide Namen sind variabel) -->
163     <xsl:result-document href="{$epubdir}/{$opsdir}/{$tocfile}" format="xhtml5">
164       <xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html&gt;</xsl:text>
165       <html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" xml:lang="de">
166 
167         <head>
168           <meta charset="utf-8" />
169           <meta name="description" content="Diskografie / TOC" />
170           <title>Inhaltsverzeichnis</title>
171         </head>
172         
173         <body>
174         
175            <nav epub:type="toc" id="toc">
176              <h1>Inhaltsverzeichnis</h1>
177            
178              <ol>
179 
180                <li id="katalogcover">
181                  <a href="{$htmldir}/katalogcover.html">Titel</a>
182                </li>
183        
184                <xsl:if test="fn:string-length(bandinfo) > 0 or referenzen">
185                  <li id="kap_infos">
186                    <a href="{$htmldir}/kapitel_infos.html">Informationen</a>
187                  </li>
188                </xsl:if>
189 
190                <xsl:for-each select="werk">
191                  <xsl:sort select="@jahr" order="ascending" data-type="number"/>
192                  <li id="kap_werk_{fn:position()}">
193                    <a href="{$htmldir}/kapitel_werk_{fn:position()}.html"><xsl:value-of select="werkname"/></a>
194                  </li>
195                </xsl:for-each>
196 
197              </ol>
198 
199            </nav>
200 
201         </body>
202       </html>
203     </xsl:result-document>
204 
205 
206     <!-- EPUB-Struktur: optional (falls $oldtoc = 1) alte toc.ncx für EPUB2-Kompatibilität im Verzeichnis OPS -->
207     <xsl:if test="$oldtoc = 1">
208       <xsl:result-document href="{$epubdir}/{$opsdir}/{$ncxfile}" format="tocncx">
209         <ncx xmlns="http://www.daisy.org/z3986/2005/ncx/" xml:lang="de" version="2005-1">
210 
211           <head>
212             <meta name="dtb:uid" content="{$ident}"/>
213             <meta name="dtb:depth" content="1"/>
214             <meta name="dtb:totalPageCount" content="0"/>
215             <meta name="dtb:maxPageNumber" content="0"/>
216           </head>
217 
218           <docTitle>
219             <text><xsl:value-of select="fn:concat('Diskografie / ', @bandname)"/></text>
220           </docTitle>
221 
222           <navMap>
223         
224             <xsl:variable name="i" select="if (fn:string-length(bandinfo) > 0 or referenzen) then 2 else 1"/>
225         
226             <xsl:if test="fn:string-length(bandinfo) > 0 or referenzen">
227               <navPoint id="navPoint-1" playOrder="1">
228                 <navLabel>
229                   <text>Titel</text>
230                 </navLabel>
231                 <content src="{$htmldir}/katalogcover.html"/>
232               </navPoint>
233             </xsl:if>
234 
235             <xsl:if test="fn:string-length(bandinfo) > 0 or referenzen">
236               <navPoint id="navPoint-2" playOrder="2">
237                 <navLabel>
238                   <text>Informationen</text>
239                 </navLabel>
240                 <content src="{$htmldir}/kapitel_infos.html"/>
241               </navPoint>
242             </xsl:if>
243 
244             <xsl:for-each select="werk">
245               <xsl:sort select="@jahr" order="ascending" data-type="number"/>
246               <navPoint id="navPoint-{fn:position() + $i}" playOrder="{fn:position() + $i}">
247                 <navLabel>
248                   <text><xsl:value-of select="werkname"/></text>
249                 </navLabel>
250                 <content src="{$htmldir}/kapitel_werk_{fn:position()}.html"/>
251               </navPoint>
252             </xsl:for-each>
253 
254           </navMap>
255 
256         </ncx>
257       </xsl:result-document>
258     </xsl:if>
259 
260 
261     <!-- externes Stylesheet -->
262     <xsl:result-document href="{$epubdir}/{$opsdir}/{$cssdir}/{$stylesheet}" format="plaintext">
263       <xsl:text>html  { margin: 0; padding: 0; }
264         body          { color: #000; background-color: #FFF; margin: 0 1em; }
265         h1,h2         { font-family: sans-serif; }
266         h1            { color: #066; background-color: inherit; margin-top: 0; font-size: 1.6em; }
267         h2            { color: #69F; background-color: inherit;  font-size: 1.3em; }
268         ol            { margin-top: 1.5em; }
269         p             { text-align: justify; }
270         p,li          { page-break-inside: avoid; }
271         a:hover       { color: #F00; background-color: inherit; }
272         div.cover img { border-radius: 10px; -webkit-box-shadow: 7px 7px 5px #999; box-shadow: 7px 7px 5px #999; }
273       </xsl:text>
274     </xsl:result-document>
275 
276 
277     <!-- XHTML-Deckblatt mit Coverbild -->
278     <xsl:result-document href="{$epubdir}/{$opsdir}/{$htmldir}/{$coverid}.html" format="xhtml5">
279       <xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html&gt;</xsl:text>
280       <html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" xml:lang="de">
281 
282         <head>
283           <meta charset="utf-8" />
284           <meta name="description" content="Diskografie / Cover" />
285           <link rel="stylesheet" type="text/css" href="../{$cssdir}/{$stylesheet}" />
286           <title>Cover</title>
287         </head>
288 
289         <body id="cover">
290           <section epub:type="cover">
291             <figure>
292               <img src="../{$imgdir}/{$coverid}.jpg" alt="{$coverid}" title="" />
293             </figure>
294           </section>
295         </body>
296 
297       </html>
298     </xsl:result-document>
299 
300 
301     <!-- optionale Informationsseite als XHTML-Datei ausgeben -->
302     <xsl:if test="fn:string-length(bandinfo) > 0 or referenzen">
303       <xsl:result-document href="{$epubdir}/{$opsdir}/{$htmldir}/kapitel_infos.html" format="xhtml5">
304         <xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html&gt;</xsl:text>
305         <html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" xml:lang="de">
306 
307           <head>
308             <meta charset="utf-8" />
309             <meta name="description" content="Diskografie / Informationen" />
310             <link rel="stylesheet" type="text/css" href="../{$cssdir}/{$stylesheet}" />
311             <title><xsl:value-of select="werkname"/></title>
312           </head>
313 
314            <body>
315 
316             <section epub:type="chapter introduction">
317               <header>
318                 <!-- Hauptüberschrift -->
319                 <h1><xsl:value-of select="fn:concat('Diskografie / ', @bandname)"/></h1>
320               </header>
321 
322               <!-- optionalen Bandinfotext ausgeben -->
323               <xsl:apply-templates select="bandinfo[fn:string-length(.) > 0]"/>
324 
325               <!-- optionale Referenzen verarbeiten -->
326               <xsl:apply-templates select="referenzen"/>
327             </section>
328 
329           </body>
330 
331         </html>
332       </xsl:result-document>
333     </xsl:if>
334 
335 
336     <!-- werk-Verarbeitung -->
337     <xsl:apply-templates select="werk">
338       <xsl:sort select="@jahr" order="ascending" data-type="number"/>
339     </xsl:apply-templates>
340 
341   </xsl:template>
342 
343 
344   <!-- Kapitelinhalte als XHTML-Dateien ausgeben -->
345   <xsl:template match="werk">
346 
347     <xsl:result-document href="{$epubdir}/{$opsdir}/{$htmldir}/kapitel_werk_{fn:position()}.html" format="xhtml5">
348       <xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html&gt;</xsl:text>
349       <html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" xml:lang="de">
350 
351         <head>
352           <meta charset="utf-8" />
353           <meta name="description" content="Diskografie / Werk {fn:position()}" />
354           <link rel="stylesheet" type="text/css" href="../{$cssdir}/{$stylesheet}" />
355           <title><xsl:value-of select="werkname"/></title>
356         </head>
357 
358         <body>
359 
360           <section epub:type="chapter">
361             <header>
362               <!-- Wername als Überschrift ausgeben -->
363               <h1>[<xsl:value-of select="fn:position()"/>] <xsl:value-of select="werkname"/></h1>
364 
365               <!-- Erscheinungsjahr sowie optionalen Typ und optionale Bewertungssterne ausgeben -->
366               <h2>
367                 <xsl:value-of select="@jahr"/>
368 
369                 <xsl:if test="fn:string-length(@typ) > 0">
370                   <xsl:value-of select="fn:concat(' (', @typ, ') ')"/>
371                 </xsl:if>
372 
373                 <xsl:if test="@bewertung >= 1">
374                   <xsl:for-each select="1 to @bewertung">
375                     <img src="../{$imgdir}/stern.gif" alt="*" />
376                   </xsl:for-each>
377                 </xsl:if>
378               </h2>
379             </header>
380 
381             <!-- optionales Coverbild ausgeben -->
382             <xsl:apply-templates select="coverbild[fn:string-length(.) > 0]"/>
383 
384             <!-- Titelliste ausgeben -->
385             <xsl:apply-templates select="titelliste"/>
386 
387             <!-- Gesamtzeit über externe Funktion ausgeben, sofern @spielzeit bei allen titel-Elementen vorhanden -->
388             <xsl:if test="fn:count(titelliste/titel) = fn:count(titelliste/titel/@spielzeit)">
389               <xsl:variable name="spielzeiten" select="for $t in titelliste/titel return $t/@spielzeit"/>
390               <p>Gesamtzeit: <xsl:value-of select="tm:gesamtzeit($spielzeiten)"/></p>
391             </xsl:if>
392 
393             <!-- optionalen Kommentar ausgeben -->
394             <xsl:apply-templates select="kommentar[fn:string-length(.) > 0]"/>
395           </section>
396 
397         </body>
398 
399       </html>
400     </xsl:result-document>
401 
402   </xsl:template>
403 
404 
405   <!-- Template für die bandinfo-Verarbeitung -->
406   <xsl:template match="bandinfo">
407 
408     <h2>Einführung</h2>
409     <p><strong><xsl:value-of select="."/></strong></p>
410 
411   </xsl:template>
412 
413 
414   <!-- Template für die referenzen-Verarbeitung -->
415   <xsl:template match="referenzen">
416 
417     <h2>Referenzen</h2>
418     <ul>
419       <xsl:apply-templates select="referenz"/>
420     </ul>
421 
422   </xsl:template>
423 
424 
425   <!-- Template für die referenz-Verarbeitung als Listeneintrag -->
426   <xsl:template match="referenz">
427 
428     <li>
429       <xsl:choose>
430         <xsl:when test="fn:string-length(@url) > 0">
431           <a href="{@url}"><xsl:value-of select="."/></a>
432         </xsl:when>
433         <xsl:otherwise>
434           <xsl:value-of select="."/>
435         </xsl:otherwise>
436       </xsl:choose>
437     </li>
438     
439   </xsl:template>
440 
441 
442   <!-- Template für die coverbild-Verarbeitung -->
443   <xsl:template match="coverbild">
444 
445     <div class="cover"><img src="../{$imgdir}/{.}" alt="Coverbild" /></div>
446 
447   </xsl:template>
448 
449 
450   <!-- Template für die titelliste-Verarbeitung -->
451   <xsl:template match="titelliste">
452 
453     <ol>
454       <xsl:apply-templates select="titel"/>
455     </ol>
456 
457   </xsl:template>
458 
459 
460   <!-- Template für die titel-Verarbeitung als Listeneintrag -->
461   <xsl:template match="titel">
462   
463     <li>
464       <xsl:value-of select="."/>
465       <xsl:if test="fn:string-length(@spielzeit) > 0">
466         <xsl:value-of select="fn:concat(' (', @spielzeit, ')')"/>
467       </xsl:if>
468     </li>
469   
470   </xsl:template>
471 
472 
473   <!-- Template für die kommentar-Verarbeitung -->
474   <xsl:template match="kommentar">
475 
476     <p>Kommentar: 
477       <em>
478         <xsl:value-of select="."/>
479       </em>
480     </p>
481 
482   </xsl:template>
483 
484 </xsl:stylesheet>

Code formatiert mit »Highlight 3.7«