<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
	<xsl:output method="text" indent="no" omit-xml-declaration="yes"/>
	<xsl:param name="rejectClassicalTrackTitleDups">TRUE</xsl:param>
	<xsl:param name="enforceTrackGenreAsAlbum">FALSE</xsl:param>
	<!-- this rule is no longer used!! -->
	<xsl:param name="trackGenreAsAlbumExclusions"/>
	<xsl:param name="enforceRelatedUPCAsMnCompCode">TRUE</xsl:param>
	<xsl:param name="relUpcAsMnCompCodeExclusions"/>
	<xsl:param name="enforceAllTracksPresent">TRUE</xsl:param>
	<xsl:param name="allTracksPresentExclusions"/>
	<xsl:param name="enforceTrackLabelAsAlbum">FALSE</xsl:param>
	<xsl:param name="ignoreDisallowedData">TRUE</xsl:param>
	<xsl:template match="text()">
		<!-- override the default template for the text nodes. -->
	</xsl:template>

	<xsl:include href="MetadataCardinality.xsl"/>

	<xsl:template match="MUSICNET_COMPONENT">
		<xsl:variable name="corpCode" select="CORP_CODE"/>
		<!-- xsl:value-of select="count(../MUSICNET_COMPONENT)"/-->
		<xsl:if test="COMPONENT_TYPE='TRACK'">
			<xsl:variable name="padedDiscNo">
				<xsl:number format="01" value="METADATA[TYPE='DISC_NUMBER']/VALUE"/>
			</xsl:variable>
			<xsl:variable name="padedTrackNo">
				<xsl:number format="01" value="METADATA[TYPE='TRACK_NUMBER']/VALUE"/>
			</xsl:variable>
			<xsl:variable name="mnCompCode" select="concat(../MUSICNET_COMPONENT_CODE,'_',$padedDiscNo,'_',$padedTrackNo)"/>
			<xsl:if test="MUSICNET_COMPONENT_CODE!=$mnCompCode">
                Error: wrong MUSICNET_COMPONENT_CODE: <xsl:value-of select="MUSICNET_COMPONENT_CODE"/>. Expecting: <xsl:value-of select="$mnCompCode"/>
			</xsl:if>
			<!-- GENRE has to match PARENT genre metadata if requested -->
<!-- cdv-1317 Remove this check
			<xsl:if test="$enforceTrackGenreAsAlbum='TRUE'">
				<xsl:if test="not(contains($trackGenreAsAlbumExclusions, $corpCode))">
					<xsl:if test="not(METADATA[TYPE='GENRE']/VALUE=../METADATA[TYPE='GENRE']/VALUE)">
                            Error: GENRE on <xsl:value-of select="MUSICNET_COMPONENT_CODE"/> value: <xsl:value-of select="METADATA[TYPE='GENRE']/VALUE"/> does not match parent GENRE
                        </xsl:if>
				</xsl:if>
			</xsl:if>
  -->
			<!-- LABEL has to match PARENT LABEL if requested -->
			<xsl:if test="$enforceTrackLabelAsAlbum='TRUE'">
				<xsl:variable name="vLabel" select="translate(LABEL_CODE,'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/>
				<xsl:variable name="vParentLabel" select="translate(../LABEL_CODE,'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/>
				<xsl:if test="not($vLabel=$vParentLabel)">
                        Error: LABEL on <xsl:value-of select="MUSICNET_COMPONENT_CODE"/> value: <xsl:value-of select="LABEL_CODE"/> does not match parent LABEL
                    </xsl:if>
			</xsl:if>
		</xsl:if>
		<xsl:if test="COMPONENT_TYPE='ALBUM'">
			<!-- ensure valid component code -->
			<xsl:if test="contains(MUSICNET_COMPONENT_CODE,'_')">
                    Error:Invalid component code for ALBUM component  on <xsl:value-of select="MUSICNET_COMPONENT_CODE"/>
			</xsl:if>
			<!-- ensure no collection_components -->
			<xsl:if test="count(COLLECTION_COMPONENT)>1">
                    Error: COLLECTION_COMPONENT element not valid for ALBUM component  on <xsl:value-of select="MUSICNET_COMPONENT_CODE"/>
			</xsl:if>
			<xsl:if test="$enforceRelatedUPCAsMnCompCode='TRUE'">
				<xsl:if test="not(contains($relUpcAsMnCompCodeExclusions, $corpCode))">
					<xsl:if test="not(METADATA[TYPE='RELATED_UPC']/VALUE=MUSICNET_COMPONENT_CODE) and not(METADATA[TYPE='RELATED_UPC']/VALUE='NA')">
                            Error: wrong RELATED_UPC on <xsl:value-of select="MUSICNET_COMPONENT_CODE"/> value: <xsl:value-of select="METADATA[TYPE='RELATED_UPC']/VALUE"/>. Expecting: <xsl:value-of select="MUSICNET_COMPONENT_CODE"/>
					</xsl:if>
				</xsl:if>
			</xsl:if>
			<!-- number of tracks correspond to TRACKS -->
			<!-- if not specifically deactivated for Sony and Universal -->
			<xsl:if test="$enforceAllTracksPresent='TRUE'">
				<xsl:if test="not(contains($allTracksPresentExclusions, $corpCode))">
					<xsl:if test="not(count(MUSICNET_COMPONENT)=METADATA[TYPE='TRACKS']/VALUE)">
                            Error: number of tracks does not match TRACKS metadata on <xsl:value-of select="MUSICNET_COMPONENT_CODE"/>
					</xsl:if>
				</xsl:if>
			</xsl:if>
			<!-- The TRACKS's title must be unique for Classical Albums; if not specifically allowed -->
			<xsl:if test="$rejectClassicalTrackTitleDups='TRUE'">
				<xsl:if test="METADATA[TYPE='GENRE']/VALUE='Classical/Opera'">
					<xsl:if test="count(MUSICNET_COMPONENT[not(METADATA[TYPE='TITLE']/VALUE =
                            preceding::MUSICNET_COMPONENT/METADATA[TYPE='TITLE']/VALUE)]) != METADATA[TYPE='TRACKS']/VALUE">
                            Error: Classical ALBUM (<xsl:value-of select="MUSICNET_COMPONENT_CODE"/>) contains duplicate TRACK titles.
                        </xsl:if>
				</xsl:if>
			</xsl:if>
		</xsl:if>
		<xsl:if test="COMPONENT_TYPE='COLLECTION'">
			<!-- ensure valid component code -->
            <!--
			<xsl:if test="not(contains(MUSICNET_COMPONENT_CODE,'_'))">
                    Error:Invalid component code for COLLECTION component  on <xsl:value-of select="MUSICNET_COMPONENT_CODE"/>
			</xsl:if>
              -->
			<!-- ensure no track components -->
			<xsl:if test="count(MUSICNET_COMPONENT)>1">
                    Error: MUSICNET_COMPONENT element not valid for COLLECTION component  on <xsl:value-of select="MUSICNET_COMPONENT_CODE"/>
			</xsl:if>
			<xsl:if test="$enforceRelatedUPCAsMnCompCode='TRUE'">
				<xsl:if test="not(contains($relUpcAsMnCompCodeExclusions, $corpCode))">
					<xsl:if test="not(METADATA[TYPE='RELATED_UPC']/VALUE=MUSICNET_COMPONENT_CODE) and not(METADATA[TYPE='RELATED_UPC']/VALUE='NA')">
                            Error: wrong RELATED_UPC on <xsl:value-of select="MUSICNET_COMPONENT_CODE"/> value: <xsl:value-of select="METADATA[TYPE='RELATED_UPC']/VALUE"/>. Expecting: <xsl:value-of select="MUSICNET_COMPONENT_CODE"/>
					</xsl:if>
				</xsl:if>
			</xsl:if>
		</xsl:if>
        <xsl:apply-templates select="." mode="check-cardinality"/>
        <xsl:apply-templates select="." mode="check-territory-metadata"/>
		<xsl:apply-templates/>
	</xsl:template>
	<xsl:template match="METADATA/TYPE">
		<!-- This is checked in METADATA/VALUE -->
	</xsl:template>
	<!-- Various Metadata Specific checks -->
	<xsl:include href="GenreCodes.xsl"/>
	<xsl:template match="METADATA[TYPE='DURATION']">
		<!-- format min:sec -->
		<xsl:if test="not(translate(VALUE, '0123456789','9999999999')='9:99' or
                            translate(VALUE, '0123456789','9999999999')='99:99' or
                            translate(VALUE, '0123456789','9999999999')='999:99')">
                Error: wrong format of DURATION on <xsl:value-of select="../MUSICNET_COMPONENT_CODE"/> value: <xsl:value-of select="VALUE"/>
		</xsl:if>
	</xsl:template>
	<xsl:template match="METADATA[TYPE='RELEASE_DATE']">
		<!-- format YYYY or YYYYMM or YYYYMMDD -->
		<xsl:if test="not(translate(VALUE, '0123456789','9999999999')='9999' or
                              translate(VALUE, '0123456789','9999999999')='999999' or
                              translate(VALUE, '0123456789','9999999999')='99999999')">
                Error: wrong format of RELEASE_DATE on <xsl:value-of select="../MUSICNET_COMPONENT_CODE"/> value: <xsl:value-of select="VALUE"/>
		</xsl:if>
	</xsl:template>
	<xsl:template match="METADATA[TYPE='TRACKS']">
		<!-- format NNN -->
		<xsl:if test="not(translate(VALUE, '0123456789','9999999999')='9' or
                            translate(VALUE, '0123456789','9999999999')='99' or
                            translate(VALUE, '0123456789','9999999999')='999')">
                Error: wrong format of TRACKS on <xsl:value-of select="../MUSICNET_COMPONENT_CODE"/> value: <xsl:value-of select="VALUE"/>
		</xsl:if>
	</xsl:template>
	<xsl:template match="METADATA[TYPE='TRACK_NUMBER']">
		<!-- format NNN -->
		<xsl:if test="not(translate(VALUE, '0123456789','9999999999')='9' or
                            translate(VALUE, '0123456789','9999999999')='99' or
                            translate(VALUE, '0123456789','9999999999')='999')">
                Error: wrong format of TRACK_NUMBER on <xsl:value-of select="../MUSICNET_COMPONENT_CODE"/> value: <xsl:value-of select="VALUE"/>
		</xsl:if>
	</xsl:template>
	<xsl:template match="METADATA[TYPE='ISRC']">
		<xsl:variable name="check">
			<xsl:value-of select="translate(VALUE, ' -', '')"/>
		</xsl:variable>
		<xsl:choose>
			<xsl:when test="string-length($check)=0"/>
			<xsl:when test="not(string-length($check)=12)">
                Error: ISRC code not 12 characters long <xsl:value-of select="../MUSICNET_COMPONENT_CODE"/> value: <xsl:value-of select="VALUE"/>
			</xsl:when>
			<xsl:otherwise>
				<xsl:if test="not(translate(substring($check,1,2), 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')='aa')">
                Error: ISRC code does not start with two letters on <xsl:value-of select="../MUSICNET_COMPONENT_CODE"/> value: <xsl:value-of select="VALUE"/>
				</xsl:if>
				<xsl:if test="not(translate(substring($check,6), '0123456789','9999999999')='9999999')">
                Error: ISRC code does not end with seven digits on <xsl:value-of select="../MUSICNET_COMPONENT_CODE"/> value: <xsl:value-of select="VALUE"/>
				</xsl:if>
			</xsl:otherwise>
		</xsl:choose>
	</xsl:template>
	<xsl:template match="METADATA[TYPE='PARENTAL_ADVISORY']">
		<!-- format TRUE/FALSE -->
		<xsl:if test="not(VALUE='FALSE' or VALUE='TRUE')">
                Error: wrong value of PARENTAL_ADVISORY on <xsl:value-of select="../MUSICNET_COMPONENT_CODE"/> value: <xsl:value-of select="VALUE"/>
		</xsl:if>
	</xsl:template>
	<xsl:template match="METADATA[TYPE='RELATED_UPC']">
		<xsl:if test="VALUE=''">
                Error: RELATED_UPC has an empty value on <xsl:value-of select="../MUSICNET_COMPONENT_CODE"/>
		</xsl:if>
	</xsl:template>
	<xsl:template match="PRICE[TYPE='LABEL_COST']">
		<!-- Ensure price date ranges are valid for each element and each group of elements for same
        territory and currency -->
		<xsl:variable name="priceEffFromDate" select="number(translate(EFFECTIVE_FROM_DATE,'-',''))"/>
		<!-- assign eff to date to variable or max date if not found -->
		<xsl:variable name="priceEffToDate">
			<xsl:if test="EFFECTIVE_TO_DATE">
				<xsl:value-of select="number(translate(EFFECTIVE_TO_DATE,'-',''))"/>
			</xsl:if>
			<xsl:if test="not(EFFECTIVE_TO_DATE)">
				<xsl:value-of select="number(99991231)"/>
			</xsl:if>
		</xsl:variable>
		<xsl:if test="$priceEffToDate &lt; $priceEffFromDate">
                Error: Price EFFECTIVE_TO_DATE cannot be less than EFFECTIVE_FROM_DATE.  Comp Code is: <xsl:value-of select="../MUSICNET_COMPONENT_CODE"/>
		</xsl:if>
		<xsl:variable name="price" select="."/>
		<xsl:variable name="territory" select="TERRITORY_CODE"/>
		<xsl:variable name="currency" select="CURRENCY_CODE"/>
		<xsl:variable name="retailer" select="RETAILER_CODE"/>
		<xsl:variable name="scope">
			<xsl:if test="SCOPE">
				<xsl:value-of select="SCOPE"/>
			</xsl:if>
			<xsl:if test="not(SCOPE)">DMS_PRICE</xsl:if>
		</xsl:variable>
		<xsl:for-each select="../PRICE[TYPE='LABEL_COST'][TERRITORY_CODE=$territory][CURRENCY_CODE=$currency]">
			<xsl:if test="$price != . and string(RETAILER_CODE)=string($retailer)">
				<xsl:variable name="scope2">
					<xsl:if test="SCOPE">
						<xsl:value-of select="SCOPE"/>
					</xsl:if>
					<xsl:if test="not(SCOPE)">DMS_PRICE</xsl:if>
				</xsl:variable>
				<!-- Make sure price info is for same scope -->
				<xsl:if test="$scope = $scope2">
					<xsl:variable name="priceEffFromDate2" select="number(translate(EFFECTIVE_FROM_DATE,'-',''))"/>
					<!-- assign eff to date to variable or max date if not found -->
					<xsl:variable name="priceEffToDate2">
						<xsl:if test="EFFECTIVE_TO_DATE">
							<xsl:value-of select="number(translate(EFFECTIVE_TO_DATE,'-',''))"/>
						</xsl:if>
						<xsl:if test="not(EFFECTIVE_TO_DATE)">
							<xsl:value-of select="number(99991231)"/>
						</xsl:if>
					</xsl:variable>
					<xsl:if test="not($priceEffFromDate &gt; $priceEffToDate2 or $priceEffToDate &lt; $priceEffFromDate2)">
                            Error: Price effective date periods overlap for price elements with same scope, territory, currency and retailer.  Comp Code is: <xsl:value-of select="../MUSICNET_COMPONENT_CODE"/>
					</xsl:if>
				</xsl:if>
			</xsl:if>
		</xsl:for-each>
	</xsl:template>
	<!-- Ensure date ranges are valid for any right type -->
	<xsl:template match="STREAM_RIGHT|DOWNLOAD_RIGHT|_CD_BURN_RIGHT|TRANSFER2PD_RIGHT|FREE_STREAM_RIGHT|DIGITAL_AVAILABILITY|BUNDLE_RESTRICTION|LABEL_APPR_IND|PUBLISHER_APPR_IND|PUBLISHER_OVERRIDE_CODE|NON_DRM_PURCHASE|NON_DRM_STREAM">
		<xsl:variable name="beginDate">
			<xsl:if test="BEGIN_DATE">
				<xsl:value-of select="number(translate(BEGIN_DATE,'-',''))"/>
			</xsl:if>
			<xsl:if test="not(BEGIN_DATE)">
				<xsl:value-of select="number(00010101)"/>
			</xsl:if>
		</xsl:variable>
		<xsl:variable name="stopDate">
			<xsl:if test="STOP_DATE">
				<xsl:value-of select="number(translate(STOP_DATE,'-',''))"/>
			</xsl:if>
			<xsl:if test="not(STOP_DATE)">
				<xsl:value-of select="number(99991231)"/>
			</xsl:if>
		</xsl:variable>
		<xsl:if test="$stopDate &lt; $beginDate">
                Error: STOP_DATE must not be less than BEGIN_DATE on: <xsl:value-of select="../MUSICNET_COMPONENT_CODE"/>  Begin Date: <xsl:value-of select="BEGIN_DATE"/>  End Date: <xsl:value-of select="STOP_DATE"/>
		</xsl:if>
		<!-- See if any matching right/territory follow this one.  That is ambigious and thus not permitted. -->
		<xsl:if test="count(following-sibling::*[name()=name(current()) and TERRITORY_CODE=current()/TERRITORY_CODE]) > 0">
                Error: More than one right <xsl:value-of select="name()"/> for territory <xsl:value-of select="./TERRITORY_CODE"/> for <xsl:value-of select="../MUSICNET_COMPONENT_CODE"/>.
		</xsl:if>
	</xsl:template>
	<xsl:template match="MUSICNET_COMPONENT/CORP_CODE">
		<!-- this is completly validated in XML schema -->
	</xsl:template>
	<xsl:template match="MUSICNET_COMPONENT/COMPONENT_TYPE">
		<!-- this is completly validated in XML schema -->
	</xsl:template>
	<xsl:template match="MUSICNET_COMPONENT/LABEL_CODE">
		<!-- this is completly validated in XML precheck -->
	</xsl:template>
	<xsl:template match="COLLECTION_COMPONENT">
		<xsl:if test="not(COMP_ID!='' or PROVIDER_COMP_ID!='' or COMPONENT_CODE!='')">
			Error: One of COMP_ID, PROVIDER_COMP_ID, or COMPONENT_CODE must be provided for a COLLECTION_COMPONENT.  Comp Code is: <xsl:value-of select="../MUSICNET_COMPONENT_CODE"/>
		</xsl:if>
	</xsl:template>
</xsl:stylesheet>
