<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:html="http://www.w3.org/1999/xhtml" xmlns="http://www.idpf.org/2007/opf" version="2.0" exclude-result-prefixes="#all">
<xsl:param name="identifier-id" as="xs:string" required="true"/>
<xsl:template match="/*">
<metadata>
<xsl:namespace name="dc" select="'http://purl.org/dc/elements/1.1/'"/>
<xsl:variable name="identifier" select="//html:head/html:meta[lower-case(@name)=('dc:identifier', 'dct:identifier', 'dcterms:identifier', 'dtb:uid')][1]"/>
<dc:identifier id="{$identifier-id}">
<xsl:copy-of select="$identifier/@scheme" exclude-result-prefixes="#all"/>
<xsl:value-of select="($identifier/@content,replace(replace(string(current-dateTime()),'\+.*',''),'[^\d]',''))[1]"/>
</dc:identifier>
<xsl:if test="not(/html:html/html:head/html:meta[lower-case(@name)='dc:language'])">
<dc:language>
<xsl:value-of select="(/*/@lang,/*/@xml:lang,'zxx')[1]"/>
</dc:language>
</xsl:if>
<dc:format id="format">EPUB3</dc:format>
<xsl:if test="not(/html:html/html:head/html:meta[lower-case(@name)='dc:title'])">
<dc:title>
<xsl:value-of select="(/html:html/html:head/html:title/text()[normalize-space()], /html:html/html:body//html:h1/text()[normalize-space()][1], replace(base-uri(/),'.*?([^/]+)\.[^/.]+$','$1') )[1]"/>
</dc:title>
</xsl:if>
<xsl:for-each select="/html:html/html:head/html:meta">
<xsl:variable name="lcname" select="lower-case(@name)"/>
<xsl:variable name="id" select="if (matches($lcname,'^dc:\w+$')) then concat(replace($lcname,'^dc:',''),'_',count(preceding-sibling::html:meta[lower-case(@name)=$lcname])+1) else if (matches($lcname,'^dtb:\w+$')) then concat(replace($lcname,'dtb:','dtb-'),'_',count(preceding-sibling::html:meta[lower-case(@name)=$lcname])) else concat('meta_',count(preceding-sibling::html:meta)+1)"/>
<xsl:choose>
<xsl:when test="@http-equiv">
<xsl:message select="'Dropping empty meta element with http-equiv'"/>
</xsl:when>
<xsl:when test="string-length(normalize-space(@content)) = 0">
<xsl:message select="concat('Dropping empty meta element: ',@name)"/>
</xsl:when>
<xsl:when test="$lcname=('dc:identifier','dct:identifier','dcterms:identifier','dtb:uid')"/>
<xsl:when test="$lcname=('dcterms:modified','dc:format')">
<xsl:message select="concat('Discarding pre-existing meta element (it will be replaced with a new one): ',@name)"/>
</xsl:when>
<xsl:when test="matches($lcname,'^dc:')">
<xsl:element name="{$lcname}">
<xsl:attribute name="id" select="$id"/>
<xsl:copy-of select="@scheme" exclude-result-prefixes="#all"/>
<xsl:value-of select="@content"/>
</xsl:element>
<xsl:if test="@role">
<meta refines="#{$id}" property="role" scheme="marc:relators">
<xsl:value-of select="@role"/>
</meta>
</xsl:if>
</xsl:when>
<xsl:when test="matches($lcname,'^dct:') or matches($lcname,'^dcterms:')">
<meta property="{replace($lcname,'^dct:','dcterms:')}">
<xsl:attribute name="id" select="$id"/>
<xsl:copy-of select="@scheme" exclude-result-prefixes="#all"/>
<xsl:value-of select="@content"/>
</meta>
</xsl:when>
<xsl:when test="@name='dtb:narrator'">
<dc:contributor id="{$id}">
<xsl:attribute name="id" select="$id"/>
<xsl:copy-of select="@scheme" exclude-result-prefixes="#all"/>
<xsl:value-of select="@content"/>
</dc:contributor>
<meta refines="#{$id}" property="role" scheme="marc:relators">nrt</meta>
</xsl:when>
<xsl:when test="@name='dtb:producer'">
<dc:contributor id="{$id}">
<xsl:attribute name="id" select="$id"/>
<xsl:copy-of select="@scheme" exclude-result-prefixes="#all"/>
<xsl:value-of select="@content"/>
</dc:contributor>
<meta refines="#{$id}" property="role" scheme="marc:relators">pro</meta>
</xsl:when>
<xsl:otherwise>
<meta property="{@name}">
<xsl:attribute name="id" select="$id"/>
<xsl:copy-of select="@scheme" exclude-result-prefixes="#all"/>
<xsl:value-of select="@content"/>
</meta>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
<meta property="dcterms:modified">
<xsl:value-of select="format-dateTime( adjust-dateTime-to-timezone(current-dateTime(),xs:dayTimeDuration('PT0H')), '[Y0001]-[M01]-[D01]T[H01]:[m01]:[s01][Z]')"/>
</meta>
</metadata>
</xsl:template>
</xsl:stylesheet>