<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:pf="http://www.daisy.org/ns/pipeline/functions" xmlns:d="http://www.daisy.org/ns/pipeline/data" xmlns:c="http://www.w3.org/ns/xproc-step" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dtb="http://www.daisy.org/z3986/2005/dtbook/" xmlns:oebpackage="http://openebook.org/namespaces/oeb-package/1.0/" xmlns="http://openebook.org/namespaces/oeb-package/1.0/" version="2.0" exclude-result-prefixes="xsl d pf xs c dc dtb oebpackage"> <xsl:import href="http://www.daisy.org/pipeline/modules/file-utils/library.xsl"/> <xsl:param name="output-base-uri"/> <xsl:param name="uid"/> <xsl:param name="total-time"/> <xsl:template match="/"> <xsl:variable name="has-audio" as="xs:boolean" select="exists(//d:file[contains(@media-type, 'audio')])"/> <xsl:variable name="has-image" as="xs:boolean" select="exists(//d:file[contains(@media-type, 'image')])"/> <xsl:variable name="has-text" as="xs:boolean" select="exists(//d:file[@media-type='application/x-dtbook+xml'])"/> <xsl:variable name="dtbook" as="document-node(element(dtb:dtbook))?" select="collection()[4]"/> <xsl:variable name="metadata" as="document-node(element(oebpackage:metadata))?" select="collection()[2]"/> <xsl:variable name="dc-metadata-from-params" as="element(c:param)*" select="collection()[3]//c:param[@namespace='http://purl.org/dc/elements/1.1/'][@value[not(.='')]]"/> <xsl:variable name="dc-metadata-from-metadata" as="element()*" select="$metadata/*/oebpackage:dc-metadata/dc:*"/> <xsl:variable name="dc-metadata-from-dtbook" as="element(dtb:meta)*" select="$dtbook//dtb:meta[matches(@name,'^dc:')]"/> <xsl:variable name="dc-metadata" as="element()*"> <xsl:for-each select="distinct-values(($dc-metadata-from-params/@name/lower-case(.), $dc-metadata-from-metadata/lower-case(substring(name(.),4)), $dc-metadata-from-dtbook/@name/lower-case(substring(.,4))))"> <xsl:element name="dc:{concat(upper-case(substring(.,1,1)),lower-case(substring(.,2)))}"> <xsl:variable name="name" select="."/> <xsl:value-of select="($dc-metadata-from-params[lower-case(@name)=lower-case($name)]/@value, $dc-metadata-from-metadata[lower-case(substring(name(.),4))=lower-case($name)]/string(.), $dc-metadata-from-dtbook[lower-case(substring(@name,4))=lower-case($name)]/@content)[1]"/> </xsl:element> </xsl:for-each> </xsl:variable> <package unique-identifier="uid"> <metadata> <dc-metadata> <dc:Format>ANSI/NISO Z39.86-2005</dc:Format> <xsl:choose> <xsl:when test="exists($dc-metadata/self::dc:Language)"> <xsl:sequence select="$dc-metadata/self::dc:Language"/> </xsl:when> <xsl:otherwise> <dc:Language><xsl:value-of select="($dtbook//@xml:lang,'und')[1]"/></dc:Language> </xsl:otherwise> </xsl:choose> <xsl:choose> <xsl:when test="exists($dc-metadata/self::dc:Date)"> <xsl:sequence select="$dc-metadata/self::dc:Date"/> </xsl:when> <xsl:otherwise> <dc:Date><xsl:value-of select="format-date(current-date(), '[Y0001]-[M01]-[D01]')"/></dc:Date> </xsl:otherwise> </xsl:choose> <xsl:choose> <xsl:when test="exists($dc-metadata/self::dc:Publisher)"> <xsl:sequence select="$dc-metadata/self::dc:Publisher"/> </xsl:when> <xsl:otherwise> <dc:Publisher>unknown</dc:Publisher> </xsl:otherwise> </xsl:choose> <xsl:choose> <xsl:when test="exists($dc-metadata/self::dc:Title)"> <xsl:for-each select="$dc-metadata/self::dc:Title"> <xsl:copy> <xsl:sequence select="@*"/> <xsl:value-of select="normalize-space(string(.))"/> </xsl:copy> </xsl:for-each> </xsl:when> <xsl:otherwise> <dc:Title>unknown</dc:Title> </xsl:otherwise> </xsl:choose> <dc:Identifier id="uid"><xsl:value-of select="$uid"/></dc:Identifier> <xsl:sequence select="$dc-metadata[not(self::dc:Format| self::dc:Language| self::dc:Date| self::dc:Publisher| self::dc:Title| self::dc:Identifier)]"/> </dc-metadata> <x-metadata> <meta name="dtb:multimediaType" content="{if ($has-text and $has-audio) then 'audioFullText' else if ($has-text) then 'textNCX' else 'audioNCX'}"/> <meta name="dtb:totalTime" content="{$total-time}"/> <meta name="dtb:multimediaContent" content="{string-join(( if ($has-audio) then 'audio' else (), if ($has-text) then 'text' else (), if ($has-image) then 'image' else ()),',')}"/> <xsl:if test="//d:file[@role='mathml-xslt-fallback']"> <meta name="z39-86-extension-version" scheme="http://www.w3.org/1998/Math/MathML" content="1.0"/> <meta name="DTBook-XSLTFallback" scheme="http://www.w3.org/1998/Math/MathML" content="{pf:relativize-uri(//d:file[@role='mathml-xslt-fallback'] /resolve-uri(@href,base-uri(.)), $output-base-uri)}"/> </xsl:if> <xsl:sequence select="$metadata/*/oebpackage:x-metadata/*[not(@name=('dtb:multimediaType', 'dtb:totalTime', 'dtb:multimediaContent', 'z39-86-extension-version', 'DTBook-XSLTFallback'))]"/> </x-metadata> </metadata> <manifest> <item href="{pf:relativize-uri($output-base-uri, $output-base-uri)}" id="opf" media-type="text/xml"/> <xsl:call-template name="manifest"/> </manifest> <spine> <xsl:call-template name="spine"/> </spine> </package> </xsl:template> <xsl:function name="d:getIdRef"> <xsl:param name="s"/> <xsl:value-of select="substring-before(tokenize($s, '[/\\]')[last()], '.')"/> </xsl:function> <xsl:template name="manifest"> <xsl:for-each select="//d:file"> <xsl:variable name="id"> <xsl:choose> <xsl:when test="contains(@media-type, 'smil')"> <xsl:value-of select="d:getIdRef(@href)"/> </xsl:when> <xsl:when test="contains(@media-type, 'ncx')"> <xsl:value-of select="'ncx'"/> </xsl:when> <xsl:when test="contains(@media-type, 'res')"> <xsl:value-of select="'resource'"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="concat('opf-', position())"/> </xsl:otherwise> </xsl:choose> </xsl:variable> <item href="{pf:relativize-uri(resolve-uri(@href, base-uri(.)), $output-base-uri)}" id="{$id}" media-type="{@media-type}"/> </xsl:for-each> </xsl:template> <xsl:template name="spine"> <xsl:for-each select="//d:file[contains(@media-type, 'smil')]"> <itemref idref="{d:getIdRef(@href)}"/> </xsl:for-each> </xsl:template> </xsl:stylesheet>