<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
	xmlns="http://purl.org/ontology/mo/"
	xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
	xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
	xmlns:xhtml="http://www.w3.org/1999/xhtml"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:foaf="http://xmlns.com/foaf/0.1/"
  xmlns:time="http://www.w3.org/2006/time#"
	xmlns:tl="http://purl.org/NET/c4dm/timeline.owl#"
	exclude-result-prefixes="xhtml"
        version="1.0">

<!-- Id: Mo-hAudio.xsl,$Version 1.2 *stable* Wednesday, Tuesday, Thursday, May 15 2008 04:52 PM By Martin McEvoy, Many thanks Yves Raimond http://dbtune.org/ for advice and guidance, Extract Music Ontology from hAudio Microformat -->

<xsl:strip-space elements="*"/>

<xsl:output method="xml" 
		   indent="yes" 
		   encoding="UTF-8" 
		   media-type="application/xml"/>

<!-- recomended for all GRDDL-able documents use <base href="http://yourdocument.url/" /> in the <head> of your xhtml page -->
<xsl:param name="self" select="xhtml:*[name() = 'base']"/>

<xsl:param name="base-uri">
<xsl:choose>
     	<xsl:when test="$self">
		<xsl:value-of select="$self/@href" />
	</xsl:when>
    	<xsl:otherwise>
		<!-- else set by processor -->
		<xsl:value-of select="''" />
    	</xsl:otherwise>
</xsl:choose>
</xsl:param>

<!-- see if there are any hAudio's with items -->
<xsl:param name="start" select="descendant::xhtml:*[contains(concat(' ',normalize-space(@class),' '),' haudio ') and descendant::xhtml:*[contains(concat(' ',normalize-space(@class),' '),' item ')]]"/>


<!-- index @class="title"/a/@href -->
<xsl:param name="index">
<xsl:choose>
     	<xsl:when test="$start">
		<xsl:value-of select="descendant::xhtml:*[contains(concat(' ',normalize-space(@class),' '),' title ')]/xhtml:a/@href" />
	</xsl:when>
    	<xsl:otherwise>
		<xsl:value-of select="$base-uri" />
    	</xsl:otherwise>
</xsl:choose>
</xsl:param>

<!-- see if we have items -->
<xsl:param name="items" select="descendant::xhtml:*[contains(concat(' ',normalize-space(@class),' '),' item ') and descendant::xhtml:*[contains(concat(' ',normalize-space(@class),' '),' title ')]]"/>

<xsl:param name="audio" select="descendant::xhtml:*[contains(concat(' ',normalize-space(@class),' '),' haudio ') and descendant::xhtml:*[contains(concat(' ',normalize-space(@class),' '),' title ')]]"/>


<xsl:template match="/">
  <rdf:RDF>
    <xsl:apply-templates/>
  </rdf:RDF>
</xsl:template>

<!-- ==============================================Temaplates===============================================-->

<xsl:template match="xhtml:html">
<xsl:for-each select="$audio">
	<xsl:call-template name="artist"/>
	<xsl:call-template name="recording"/>
	<xsl:choose>
     		<xsl:when test="$items">
			<xsl:call-template name="item"/>
		</xsl:when>
    		<xsl:otherwise>
   			<xsl:call-template name="haudio"/>
    		</xsl:otherwise>
	</xsl:choose>
</xsl:for-each>
</xsl:template>

<!-- @class="haudio" => mo:Record -->
<xsl:template name="recording">
<xsl:param name="item" select="descendant::xhtml:*[contains(concat(' ',normalize-space(@class),' '),' item ')]"/>
<xsl:element name='Record'>
	<xsl:attribute name='rdf:about'>
		<xsl:value-of select="$index"/>
	</xsl:attribute>
   	<xsl:call-template name="recordtitle"/>
   	<xsl:call-template name="type"/>
	<xsl:call-template name="artistLink"/>
	<xsl:call-template name="image"/>
	<xsl:call-template name="published"/>
		<xsl:choose>
     			<xsl:when test="$item">
				<xsl:for-each select="$item">
        				<track rdf:resource="{$base-uri}#{@id}"/>
				</xsl:for-each>
			</xsl:when>
    		<xsl:otherwise>
			<xsl:for-each select="$audio">
        			<track rdf:resource="{$base-uri}#{@id}"/>
			</xsl:for-each>
    		</xsl:otherwise>
	</xsl:choose>
</xsl:element>
</xsl:template>

<xsl:template name="artistLink">
<xsl:param name="groupLink" select="descendant::xhtml:*[contains(concat(' ',normalize-space(@class),' '),' contributor ')]"/>
<xsl:param name="groupLinkalt" select="/*//xhtml:*[contains(concat(' ',normalize-space(@class),' '),' contributor ')]"/>
<xsl:choose>
     	<xsl:when test="$groupLink">
  		<xsl:for-each select="$groupLink">
			<xsl:element name='foaf:maker'>
  				<xsl:attribute name='rdf:resource'>
					<xsl:value-of select="descendant::xhtml:*[name() = 'a']/@href"/>
				</xsl:attribute>
			</xsl:element>
		</xsl:for-each>
	</xsl:when>
    	<xsl:otherwise>
  		<xsl:for-each select="$groupLinkalt">
			<xsl:element name='foaf:maker'>
  				<xsl:attribute name='rdf:resource'>
					<xsl:value-of select="descendant::xhtml:*[name() = 'a']/@href"/>
				</xsl:attribute>
			</xsl:element>
		</xsl:for-each>
    	</xsl:otherwise>
</xsl:choose>
</xsl:template>

<!-- see if mo:Record has a title else title of page -->
<xsl:template name="recordtitle">
<xsl:param name="recordtitle" select="descendant::xhtml:*[contains(concat(' ',normalize-space(@class),' '),' title ')]"/>
<xsl:choose>
     <xsl:when test="$start">
		<xsl:element name='dc:title'><xsl:value-of select="$recordtitle"/></xsl:element>
	</xsl:when>
    	<xsl:otherwise>
		<xsl:element name='dc:title'><xsl:value-of select="descendant::xhtml:*[name() = 'title']"/></xsl:element>
    	</xsl:otherwise>
</xsl:choose>
</xsl:template>


<!-- haudio has only one type @class="album" all else is considered a compilation -->
<xsl:template name="type">
<xsl:param name="album" select="descendant::xhtml:*[contains(concat(' ',normalize-space(@class),' '),' title ') and self::xhtml:*[contains(concat(' ',normalize-space(@class),' '),' album ')]]"/>
<xsl:choose>
     	<xsl:when test="$album">
		<release_type rdf:resource="http://purl.org/ontology/mo/album"/>
	</xsl:when>
    	<xsl:otherwise>
		<release_type rdf:resource="http://purl.org/ontology/mo/compilation"/>
    	</xsl:otherwise>
</xsl:choose>
</xsl:template>


<!-- mo:image => @class="logo" or @class="photo" -->
<xsl:template name="image">
<xsl:param name="photo" select="descendant::xhtml:*[contains(concat(' ',normalize-space(@class),' '),' logo ')]|descendant::xhtml:*[contains(concat(' ',normalize-space(@class),' '),' photo ')]"/>
<xsl:if test="$photo">
	<image rdf:resource="{$photo/@src}"/>
</xsl:if>
</xsl:template>

<!-- published date dc:date => @class="published" -->
<xsl:template name="published">
<xsl:param name="pubdate" select="descendant::xhtml:*[contains(concat(' ',normalize-space(@class),' '),' published ')]"/>
<xsl:if test="$pubdate">
	<dc:date><xsl:value-of select="$pubdate" /></dc:date>
</xsl:if>
</xsl:template>

<!-- test if we are  @class="haudio" -->
<xsl:template name="haudio">
  	<xsl:for-each select="$audio">
		<xsl:call-template name="signal"/>
	</xsl:for-each>
</xsl:template>

<!-- test if we are  @class="item" -->
<xsl:template name="item">
  	<xsl:for-each select="$items">
		<xsl:call-template name="signal"/>
	</xsl:for-each>
</xsl:template>


<!-- mo:Signal and mo:Track -->
<xsl:template name="signal">
<xsl:param name="time" select="descendant::xhtml:*[contains(concat(' ',normalize-space(@class),' '),' duration ')]"/>
	<xsl:element name='Signal'>
		<xsl:call-template name="title"/>
		<xsl:element name='published_as'>
			<xsl:element name='Track'>
  				<xsl:attribute name='rdf:about'>
					<xsl:value-of select="$base-uri"/>
					<xsl:text>#</xsl:text>
					<xsl:value-of select="@id"/>
				</xsl:attribute>
				<xsl:call-template name="title"/>
				<xsl:call-template name="trackLink"/>
				<xsl:call-template name="enclosure"/>
			</xsl:element>
		</xsl:element>
	<xsl:if test="$time">
		<time>
			<time:Interval>
		   		<tl:durationXSD><xsl:value-of select="$time/@title"/></tl:durationXSD>
			</time:Interval>
		</time>
	</xsl:if>
</xsl:element>
</xsl:template>

<!-- dc:title of mo:Track => @class="title"-->
<xsl:template name="title">
<xsl:param name="title" select="descendant::xhtml:*[contains(concat(' ',normalize-space(@class),' '),' title ')]"/>
	<xsl:if test="$title">
		<xsl:element name='dc:title'>
			<xsl:value-of select="$title"/>
		</xsl:element>
	</xsl:if>
</xsl:template>


<!-- foaf:maker link => @class="contributor"/a/@href-->
<xsl:template name="trackLink">
<xsl:param name="bandLink" select="descendant::xhtml:*[contains(concat(' ',normalize-space(@class),' '),' contributor ')]"/>
<xsl:param name="bandLinkalt" select="/*//xhtml:*[contains(concat(' ',normalize-space(@class),' '),' contributor ')]/xhtml:*[name() = 'a']/@href"/>
<xsl:choose>
     	<xsl:when test="$bandLink">
  		<xsl:for-each select="$bandLink">
			<xsl:element name='foaf:maker'>
  				<xsl:attribute name='rdf:resource'>
					<xsl:value-of select="descendant::xhtml:*[name() = 'a']/@href"/>
				</xsl:attribute>
			</xsl:element>
		</xsl:for-each>
	</xsl:when>
    	<xsl:otherwise>
		<xsl:element name='foaf:maker'>
  			<xsl:attribute name='rdf:resource'>
				<xsl:value-of select="$bandLinkalt"/>
			</xsl:attribute>
		</xsl:element>
    	</xsl:otherwise>
</xsl:choose>
</xsl:template>

<!-- the file itself mo:available_as => @rel="enclosure"-->
<xsl:template name="enclosure">
<xsl:param name="enc" select="descendant::xhtml:*[contains(concat(' ',normalize-space(@rel),' '),' enclosure ')]"/>
<xsl:if test="$enc">
	<xsl:element name='available_as'>
  		<xsl:attribute name='rdf:resource'>
			<xsl:value-of select="$enc/@href"/>
		</xsl:attribute>
	</xsl:element>
</xsl:if>
</xsl:template>


<!-- mo:MusicGroup => @class="contributor"-->
<xsl:template name="artist">
<xsl:param name="group" select="descendant::xhtml:*[contains(concat(' ',normalize-space(@class),' '),' contributor ')]"/>
  	<xsl:for-each select="$group">
	<xsl:element name='MusicGroup'>
		<xsl:choose>
     			<xsl:when test="@id">
  				<xsl:attribute name='rdf:ID'>
					<xsl:value-of select="@id"/>
				</xsl:attribute>
			</xsl:when>
    		<xsl:otherwise>
  			<xsl:attribute name='rdf:about'>
				<xsl:value-of select="descendant::xhtml:*[name() = 'a']/@href"/>
			</xsl:attribute>
    		</xsl:otherwise>
		</xsl:choose>
		<xsl:element name='foaf:name'><xsl:value-of select="descendant::xhtml:*[contains(concat(' ',normalize-space(@class),' '),' fn ')]" /></xsl:element>
		<xsl:choose>
     			<xsl:when test="substring-before(//xhtml:*[name() = 'a']/@href,'musicbrainz') = 'http://'">
				<musicbrainz rdf:resource="{descendant::xhtml:*[name() = 'a']/@href}"/>
			</xsl:when>
    			<xsl:otherwise>
    			</xsl:otherwise>
		</xsl:choose>
		<xsl:call-template name="madeLink"/>
	</xsl:element>
	</xsl:for-each>
</xsl:template>

<xsl:template name="madeLink">
<xsl:param name="audio" select="/.//xhtml:*[contains(concat(' ',normalize-space(@class),' '),' haudio ') and descendant::xhtml:*[contains(concat(' ',normalize-space(@class),' '),' title ')]]"/>
<xsl:for-each select="$audio">
	<xsl:element name='made'>
  		<xsl:attribute name='rdf:resource'>
			<xsl:value-of select="descendant::xhtml:*[name() = 'a']/@href"/>
		</xsl:attribute>
	</xsl:element>
</xsl:for-each>
</xsl:template>


<!-- strip text -->
<xsl:template match="text()"></xsl:template>
</xsl:stylesheet>
