<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:f="http://www.daisy.org/ns/pipeline/internal-functions" xmlns="http://www.idpf.org/2007/opf" version="2.0" exclude-result-prefixes="#all">
<xsl:param name="output-base-uri"/>
<xsl:variable name="output-base-uri-head-with-slashes" select="if (starts-with($output-base-uri,'file:/')) then replace($output-base-uri,'^([^/]+/+).*$','$1') else replace($output-base-uri,'^([^/]+/+[^/]+).*$','$1')"/>
<xsl:variable name="output-base-uri-head" select="replace(replace($output-base-uri-head-with-slashes,'/+','/'),'/$','')"/>
<xsl:variable name="output-base-uri-tail" select="replace( replace( if (starts-with($output-base-uri,'file:/')) then replace($output-base-uri,'^file:/+','') else replace($output-base-uri,'^[^/]+/+[^/]+/+',''), '[^/]+$',''), '/+','/')"/>
<xsl:template match="/*">
<manifest>
<xsl:for-each select="*">
<item>
<xsl:copy-of select="@href|@media-type|@id"/>
<xsl:variable name="item-uri-head" select="if (starts-with(resolve-uri(@href,base-uri(.)),'file:/')) then 'file:' else replace(replace(resolve-uri(@href,base-uri(.)),'^([^/]+/+[^/]+)/.*$','$1'),'/+','/')"/>
<xsl:variable name="item-uri-tail" select="replace( if (starts-with(resolve-uri(@href,base-uri(.)),'file:/')) then replace(resolve-uri(@href,base-uri(.)),'^file:/+','') else replace(resolve-uri(@href,base-uri(.)),'^[^/]+/+[^/]+/+',''), '/+','/')"/>
<xsl:if test="$item-uri-head=$output-base-uri-head">
<xsl:attribute name="href" select="f:relative-to(tokenize(concat($output-base-uri-head,'/',$output-base-uri-tail),'/+'), tokenize(concat($item-uri-head,'/',$item-uri-tail),'/+'),'')"/>
</xsl:if>
<xsl:if test="@role='cover-image'">
<xsl:attribute name="properties" select="'cover-image'"/>
</xsl:if>
</item>
</xsl:for-each>
</manifest>
</xsl:template>
<xsl:function name="f:relative-to">
<xsl:param name="from"/>
<xsl:param name="to"/>
<xsl:param name="relation"/>
<xsl:choose>
<xsl:when test="count($to) <= 1 and count($from) = 0">
<xsl:value-of select="concat($relation,$to)"/>
</xsl:when>
<xsl:when test="string-length($relation) > 0">
<xsl:value-of select="f:relative-to( subsequence($from,2), subsequence($to,min((count($to),2))), concat( if (count($from) and string-length($from[1])) then '../' else '', $relation, if (count($to) > 1 and string-length($to[1])) then concat($to[1],'/') else ''))"/>
</xsl:when>
<xsl:when test="count($to) > 1 and $to[1]=$from[1]">
<xsl:value-of select="f:relative-to(subsequence($from,2), subsequence($to,min((count($to),2))), '')"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="f:relative-to( subsequence($from,2), subsequence($to,min((count($to),2))), concat( if (count($from) and string-length($from[1])) then '../' else '', if (count($to) > 1 and string-length($to[1])) then concat($to[1],'/') else ''))"/>
</xsl:otherwise>
</xsl:choose>
</xsl:function>
</xsl:stylesheet>