<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:d="http://www.daisy.org/ns/pipeline/data" xmlns:c="http://www.w3.org/ns/xproc-step" xmlns:f="http://www.daisy.org/ns/pipeline/internal-functions" xmlns:pf="http://www.daisy.org/ns/pipeline/functions" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:m="http://www.w3.org/1998/Math/MathML" version="3.0" xpath-default-namespace="http://www.w3.org/1999/xhtml" exclude-result-prefixes="#all"> <xsl:import href="http://www.daisy.org/pipeline/modules/file-utils/library.xsl"/> <xsl:import href="http://www.daisy.org/pipeline/modules/css-utils/library.xsl"/> <xsl:output indent="yes"/> <xsl:param name="context.fileset" as="document-node(element(d:fileset))?"/> <xsl:param name="context.in-memory" as="document-node()*"/> <xsl:template match="text()|@*"/> <xsl:variable name="doc-base" select="if (/html/head/base[@href][1]) then resolve-uri(normalize-space(/html/head/base[@href][1]/@href),base-uri(/*)) else base-uri(/*)"/> <xsl:variable name="include-input-doc" select="true()" as="xs:boolean"/> <xsl:template match="/*"> <d:fileset> <xsl:attribute name="xml:base" select="replace($doc-base,'^(.+/)[^/]*','$1')"/> <xsl:if test="$include-input-doc"> <d:file href="{replace($doc-base,'.*/([^/]+)$','$1')}" media-type="application/xhtml+xml"/> </xsl:if> <xsl:apply-templates/> </d:fileset> </xsl:template> <xsl:template match="*"> <xsl:apply-templates select="node()|@*"/> </xsl:template> <xsl:template match="@aria-describedat[not(starts-with(.,'#'))]"> <xsl:sequence select="f:fileset-entry(.,(),'description')"/> </xsl:template> <xsl:template match="link"> <xsl:variable name="rel" as="xs:string*" select="tokenize(@rel,'\s+')"/> <xsl:if test="$rel=('stylesheet','pronunciation')"> <xsl:sequence select="f:fileset-entry(@href, if (@type) then @type else if (pf:get-extension(@href)='css') then 'text/css' else if (pf:get-extension(@href)=('xsl','xslt')) then 'application/xslt+xml' else if (pf:get-extension(@href)='pls') then 'application/pls+xml' else '',$rel)"/> </xsl:if> </xsl:template> <xsl:template match="style"> <xsl:for-each select="pf:css-to-fileset(.,$doc-base,$context.fileset,$context.in-memory)"> <xsl:sequence select="f:fileset-entry(.,(),'')"/> </xsl:for-each> </xsl:template> <xsl:template match="script/@src"> <xsl:sequence select="f:fileset-entry(.,if (../@type) then ../@type else 'text/javascript','script')"/> </xsl:template> <xsl:template match="a/@href"> </xsl:template> <xsl:template match="img/@src"> <xsl:if test="not(pf:get-scheme(.)='data')"> <xsl:sequence select="f:fileset-entry(., f:image-type-from-filename(.), 'image')"/> </xsl:if> </xsl:template> <xsl:template match="img/@longdesc[not(starts-with(.,'#'))]"> <xsl:sequence select="f:fileset-entry(.,(),'description')"/> </xsl:template> <xsl:template match="iframe/@src"> <xsl:sequence select="f:fileset-entry(.,'application/xhtml+xml','content')"/> </xsl:template> <xsl:template match="embed/@src"> <xsl:sequence select="f:fileset-entry(., ../@type, '')"/> </xsl:template> <xsl:template match="object/@data"> <xsl:sequence select="f:fileset-entry(., ../@type, if (f:is-audio(., ../@type)) then 'audio' else if (f:is-image(., ../@type)) then 'image' else if (f:is-video(., ../@type)) then 'video' else '')"/> </xsl:template> <xsl:template match="audio/@src"> <xsl:sequence select="f:fileset-entry(.,(),'audio')"/> </xsl:template> <xsl:template match="video/@src"> <xsl:sequence select="f:fileset-entry(.,(),'video')"/> </xsl:template> <xsl:template match="source/@src"> <xsl:sequence select="f:fileset-entry(., ../@type, if (../../audio) then 'audio' else if (../../video) then 'video' else '')"/> </xsl:template> <xsl:template match="track/@src"> <xsl:sequence select="f:fileset-entry(.,(),'text-track')"/> </xsl:template> <xsl:template match="svg:animation/@xlink:href"> <xsl:sequence select="f:fileset-entry(.,'application/svg+xml','image animation')"/> </xsl:template> <xsl:template match="svg:audio/@xlink:href"> <xsl:sequence select="f:fileset-entry(., ../@type, 'audio')"/> </xsl:template> <xsl:template match="svg:foreignObject/@xlink:href"> <xsl:sequence select="f:fileset-entry(.,(),'')"/> </xsl:template> <xsl:template match="svg:font-face-uri/@xlink:href"> <xsl:sequence select="f:fileset-entry(.,(),'font')"/> </xsl:template> <xsl:template match="svg:handler/@xlink:href"> <xsl:sequence select="f:fileset-entry(., ../@type, '')"/> </xsl:template> <xsl:template match="svg:image/@xlink:href"> <xsl:sequence select="f:fileset-entry(., ../@type, 'image')"/> </xsl:template> <xsl:template match="svg:script/@xlink:href"> <xsl:sequence select="f:fileset-entry(., ../@type, 'script')"/> </xsl:template> <xsl:template match="svg:video/@xlink:href"> <xsl:sequence select="f:fileset-entry(., ../@type, 'video')"/> </xsl:template> <xsl:template match="m:annotation/@src"> <xsl:sequence select="f:fileset-entry(., ../@encoding, 'description')"/> </xsl:template> <xsl:template match="m:math/@altimg"> <xsl:sequence select="f:fileset-entry(., f:image-type-from-filename(.), 'image')"/> </xsl:template> <xsl:template match="m:mglyph/@src"> <xsl:sequence select="f:fileset-entry(.,(),'image')"/> </xsl:template> <xsl:function name="f:fileset-entry" as="element()?"> <xsl:param name="uri" as="item()"/> <xsl:param name="type" as="xs:string?"/> <xsl:param name="kind" as="xs:string?"/> <xsl:variable name="href" select="pf:normalize-uri($uri,false())"/> <xsl:if test="$href and (pf:get-scheme($href)='file' or pf:is-relative($href))"> <xsl:variable name="resolved" select=" if ($uri instance of attribute()) then resolve-uri($href,pf:base-uri($uri)) else $href "/> <xsl:variable name="file-in-context" as="element(d:file)?" select="$context.fileset//d:file[resolve-uri(@href,base-uri(.))=$resolved][1]"/> <d:file href="{pf:relativize-uri($resolved,$doc-base)}"> <xsl:choose> <xsl:when test="$file-in-context[@original-href]"> <xsl:sequence select="$file-in-context/@original-href"/> </xsl:when> <xsl:when test="$file-in-context"/> <xsl:otherwise> <xsl:attribute name="original-href" select="$resolved"/> </xsl:otherwise> </xsl:choose> <xsl:if test="$type"> <xsl:attribute name="media-type" select="$type"/> </xsl:if> <xsl:if test="$kind"> <xsl:attribute name="kind" select="$kind"/> </xsl:if> </d:file> </xsl:if> </xsl:function> <xsl:function name="f:is-audio" as="xs:boolean"> <xsl:param name="uri" as="item()?"/> <xsl:param name="type" as="item()?"/> <xsl:sequence select="starts-with($type,'audio/') or pf:get-extension($uri)=('m4a','mp3','aac','aiff','ogg','wav','wvma','flac','mpa','spx','oga','3gp')"/> </xsl:function> <xsl:function name="f:is-image" as="xs:boolean"> <xsl:param name="uri" as="item()?"/> <xsl:param name="type" as="item()?"/> <xsl:sequence select="starts-with($type,'image/') or pf:get-extension($uri)=('jpg','jpeg','png','gif','svg')"/> </xsl:function> <xsl:function name="f:is-video" as="xs:boolean"> <xsl:param name="uri" as="item()?"/> <xsl:param name="type" as="item()?"/> <xsl:sequence select="starts-with($type,'video/') or pf:get-extension($uri)=('mp4','mpeg','m4v','mp4','flv','wmv','mov','ogv')"/> </xsl:function> <xsl:function name="f:image-type-from-filename" as="xs:string?"> <xsl:param name="src" as="item()?"/> <xsl:sequence select="if (matches($src,'.*\.png$','i')) then 'image/png' else if (matches($src,'.*\.jpe?g$','i')) then 'image/jpeg' else if (matches($src,'.*\.gif$','i')) then 'image/gif' else if (matches($src,'.*\.svg$','i')) then 'image/svg+xml' else ()"/> </xsl:function> </xsl:stylesheet>