<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
	version="1.0"
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:dcterms="http://purl.org/dc/terms/"
	xmlns:bs8723="http://schemas.bs8723.org/XmlSchema/"
	exclude-result-prefixes="bs8723 dc dcterms"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
	<xsl:include href="../../BS8723-5/Transformations/BS8723-5Utility.xsl"/>
	<!-- 
	Ceri Binding (University of Glamorgan). Convert BS8723 XML TO Zthes XML:
	demonstrates the transformation from concept-based to term-based thesauri.
	
	Modified by Nicolas Cochard (ncochard@porism.com) 2007-07-11
	-->
	<xsl:template match="bs8723:Thesaurus">
		<xsl:element name="Zthes">
			<xsl:attribute name="noNamespaceSchemaLocation" namespace="http://www.w3.org/2001/XMLSchema-instance">../XmlSchema/zthes-1.0.xsd</xsl:attribute>
			<xsl:apply-templates select="bs8723:ThesaurusConcept"/>
			<xsl:apply-templates select="bs8723:ThesaurusArray"/>
		</xsl:element>
	</xsl:template>
	<xsl:template match="bs8723:ThesaurusArray">
		<xsl:variable name="Array" select="."/>
		<xsl:apply-templates select="bs8723:IsLabelledBy">
			<xsl:with-param name="Array" select="$Array"/>
		</xsl:apply-templates>
	</xsl:template>
	<xsl:template match="bs8723:IsLabelledBy">
		<xsl:param name="Array"/>
		<xsl:variable name="Language" select="@xml:lang"/>
		<xsl:element name="term">
			<xsl:element name="termId">
				<xsl:value-of select="generate-id()"/>
			</xsl:element>
			<xsl:element name="termName">
				<xsl:value-of select="bs8723:LexicalValue"/>
			</xsl:element>
			<xsl:element name="termType">NL</xsl:element>
			<xsl:if test="@xml:lang">
				<xsl:element name="termLanguage">
					<xsl:value-of select="@xml:lang"/>
				</xsl:element>
			</xsl:if>
			<xsl:variable name="SubordinateArrays" select="/bs8723:Thesaurus/bs8723:ThesaurusArray[(@dc:identifier = $Array/bs8723:HasMember) and (bs8723:IsLabelledBy)]"/>
			<xsl:variable name="NarrowerConcepts" select="/bs8723:Thesaurus/bs8723:ThesaurusConcept[@dc:identifier = $Array/bs8723:HasMember]"/>
			<xsl:for-each select="$NarrowerConcepts/.">
				<xsl:variable name="ReferencedTerm" select="bs8723:PreferredTerm[(@xml:lang = $Language) or ((not(@xml:lang) or (@xml:lang = '')) and (not($Language) or ($Language = '')))]"/>
				<xsl:variable name="Contains">
					<xsl:call-template name="ArraysContainsConcept">
						<xsl:with-param name="Arrays" select="$SubordinateArrays"/>
						<xsl:with-param name="ConceptID" select="@dc:identifier"/>
					</xsl:call-template>
				</xsl:variable>
				<xsl:if test="not(contains($Contains, 'true'))">
					<xsl:element name="relation">
						<xsl:element name="relationType">NT</xsl:element>
						<xsl:element name="termId">
							<xsl:value-of select="$ReferencedTerm/@dc:identifier"/>
						</xsl:element>
						<xsl:element name="termName">
							<xsl:value-of select="$ReferencedTerm/bs8723:LexicalValue"/>
						</xsl:element>
						<xsl:element name="termType">
							<xsl:text>PT</xsl:text>
						</xsl:element>
						<xsl:if test="$ReferencedTerm/@xml:lang">
							<xsl:element name="termLanguage">
								<xsl:value-of select="$ReferencedTerm/@xml:lang"/>
							</xsl:element>
						</xsl:if>
					</xsl:element>
				</xsl:if>
			</xsl:for-each>
			<xsl:for-each select="$SubordinateArrays/.">
				<xsl:variable name="ReferencedNodeLabel" select="bs8723:IsLabelledBy[(@xml:lang = $Language) or ((not(@xml:lang) or (@xml:lang = '')) and (not($Language) or ($Language = '')))]"/>
				<xsl:element name="relation">
					<xsl:element name="relationType">NT</xsl:element>
					<xsl:for-each select="$ReferencedNodeLabel">
						<xsl:element name="termId">
							<xsl:value-of select="generate-id()"/>
						</xsl:element>
					</xsl:for-each>
					<xsl:element name="termName">
						<xsl:value-of select="$ReferencedNodeLabel/bs8723:LexicalValue"/>
					</xsl:element>
					<xsl:element name="termType">
						<xsl:text>NL</xsl:text>
					</xsl:element>
					<xsl:if test="$ReferencedNodeLabel/@xml:lang">
						<xsl:element name="termLanguage">
							<xsl:value-of select="$ReferencedNodeLabel/@xml:lang"/>
						</xsl:element>
					</xsl:if>
				</xsl:element>
			</xsl:for-each>
			<xsl:variable name="SuperordinateArrays" select="/bs8723:Thesaurus/bs8723:ThesaurusArray[(@dc:identifier = $Array/bs8723:HasSuperOrdinate) and (bs8723:IsLabelledBy)]"/>
			<xsl:variable name="BroaderConcepts" select="/bs8723:Thesaurus/bs8723:ThesaurusConcept[@dc:identifier = $Array/bs8723:HasSuperOrdinate]"/>
			<xsl:for-each select="$BroaderConcepts/.">
				<xsl:variable name="ReferencedTerm" select="bs8723:PreferredTerm[(@xml:lang = $Language) or ((not(@xml:lang) or (@xml:lang = '')) and (not($Language) or ($Language = '')))]"/>
				<xsl:variable name="Contains">
					<xsl:call-template name="ArraysContainsConcept">
						<xsl:with-param name="Arrays" select="$SuperordinateArrays"/>
						<xsl:with-param name="ConceptID" select="@dc:identifier"/>
					</xsl:call-template>
				</xsl:variable>
				<xsl:if test="not(contains($Contains, 'true'))">
					<xsl:element name="relation">
						<xsl:element name="relationType">BT</xsl:element>
						<xsl:element name="termId">
							<xsl:value-of select="$ReferencedTerm/@dc:identifier"/>
						</xsl:element>
						<xsl:element name="termName">
							<xsl:value-of select="$ReferencedTerm/bs8723:LexicalValue"/>
						</xsl:element>
						<xsl:element name="termType">
							<xsl:text>PT</xsl:text>
						</xsl:element>
						<xsl:if test="$ReferencedTerm/@xml:lang">
							<xsl:element name="termLanguage">
								<xsl:value-of select="$ReferencedTerm/@xml:lang"/>
							</xsl:element>
						</xsl:if>
					</xsl:element>
				</xsl:if>
			</xsl:for-each>
			<xsl:for-each select="$SuperordinateArrays/.">
				<xsl:variable name="ReferencedNodeLabel" select="bs8723:IsLabelledBy[(@xml:lang = $Language) or ((not(@xml:lang) or (@xml:lang = '')) and (not($Language) or ($Language = '')))]"/>
				<xsl:element name="relation">
					<xsl:element name="relationType">BT</xsl:element>
					<xsl:for-each select="$ReferencedNodeLabel">
						<xsl:element name="termId">
							<xsl:value-of select="generate-id()"/>
						</xsl:element>
					</xsl:for-each>
					<xsl:element name="termName">
						<xsl:value-of select="$ReferencedNodeLabel/bs8723:LexicalValue"/>
					</xsl:element>
					<xsl:element name="termType">
						<xsl:text>NL</xsl:text>
					</xsl:element>
					<xsl:if test="$ReferencedNodeLabel/@xml:lang">
						<xsl:element name="termLanguage">
							<xsl:value-of select="$ReferencedNodeLabel/@xml:lang"/>
						</xsl:element>
					</xsl:if>
				</xsl:element>
			</xsl:for-each>
		</xsl:element>
	</xsl:template>
	<xsl:template match="bs8723:ThesaurusConcept">
		<xsl:variable name="Concept" select="."/>
		<xsl:apply-templates select="bs8723:PreferredTerm">
			<xsl:with-param name="Concept" select="$Concept"/>
		</xsl:apply-templates>
		<xsl:apply-templates select="bs8723:NonPreferredTerm">
			<xsl:with-param name="Concept" select="$Concept"/>
		</xsl:apply-templates>
	</xsl:template>
	<xsl:template match="bs8723:PreferredTerm">
		<xsl:param name="Concept"/>
		<xsl:variable name="PreferredTerm" select="."/>
		<xsl:variable name="Language" select="@xml:lang"/>
		<xsl:element name="term">
			<xsl:call-template name="Term">
				<xsl:with-param name="Concept" select="$Concept"/>
				<xsl:with-param name="Type">PT</xsl:with-param>
			</xsl:call-template>
			<xsl:for-each select="$Concept/bs8723:NonPreferredTerm[(@xml:lang = $Language) or ((not(@xml:lang) or (@xml:lang = '')) and (not($Language) or ($Language = '')))]">
				<xsl:element name="relation">
					<xsl:element name="relationType">UF</xsl:element>
					<xsl:element name="termId">
						<xsl:value-of select="@dc:identifier"/>
					</xsl:element>
					<xsl:element name="termName">
						<xsl:value-of select="bs8723:LexicalValue"/>
					</xsl:element>
					<xsl:if test="@xml:lang">
						<xsl:element name="termLanguage">
							<xsl:value-of select="@xml:lang"/>
						</xsl:element>
					</xsl:if>
				</xsl:element>
			</xsl:for-each>
			<xsl:for-each select="$Concept/bs8723:PreferredTerm[@xml:lang != $Language]">
				<xsl:element name="relation">
					<xsl:element name="relationType">LE</xsl:element>
					<xsl:element name="termId">
						<xsl:value-of select="@dc:identifier"/>
					</xsl:element>
					<xsl:element name="termName">
						<xsl:value-of select="bs8723:LexicalValue"/>
					</xsl:element>
					<xsl:element name="termType">
						<xsl:text>PT</xsl:text>
					</xsl:element>
					<xsl:if test="@xml:lang">
						<xsl:element name="termLanguage">
							<xsl:value-of select="@xml:lang"/>
						</xsl:element>
					</xsl:if>
				</xsl:element>
			</xsl:for-each>
			<xsl:variable name="SubordinateArrays" select="/bs8723:Thesaurus/bs8723:ThesaurusArray[(bs8723:HasSuperOrdinate = $Concept/@dc:identifier) and (bs8723:IsLabelledBy)]"/>
			<xsl:variable name="NarrowerConcepts" select="/bs8723:Thesaurus/bs8723:ThesaurusConcept[bs8723:HasHierRelConcept[starts-with(@Role, 'BT')] = $Concept/@dc:identifier]"/>
			<xsl:for-each select="$NarrowerConcepts/.">
				<xsl:variable name="ReferencedTerm" select="bs8723:PreferredTerm[(@xml:lang = $Language) or ((not(@xml:lang) or (@xml:lang = '')) and (not($Language) or ($Language = '')))]"/>
				<xsl:variable name="Contains">
					<xsl:call-template name="ArraysContainsConcept">
						<xsl:with-param name="Arrays" select="$SubordinateArrays"/>
						<xsl:with-param name="ConceptID" select="@dc:identifier"/>
					</xsl:call-template>
				</xsl:variable>
				<xsl:if test="not(contains($Contains, 'true'))">
					<xsl:element name="relation">
						<xsl:element name="relationType">NT</xsl:element>
						<xsl:element name="termId">
							<xsl:value-of select="$ReferencedTerm/@dc:identifier"/>
						</xsl:element>
						<xsl:element name="termName">
							<xsl:value-of select="$ReferencedTerm/bs8723:LexicalValue"/>
						</xsl:element>
						<xsl:element name="termType">
							<xsl:text>PT</xsl:text>
						</xsl:element>
						<xsl:if test="$ReferencedTerm/@xml:lang">
							<xsl:element name="termLanguage">
								<xsl:value-of select="$ReferencedTerm/@xml:lang"/>
							</xsl:element>
						</xsl:if>
					</xsl:element>
				</xsl:if>
			</xsl:for-each>
			<xsl:for-each select="$SubordinateArrays/.">
				<xsl:variable name="ReferencedNodeLabel" select="bs8723:IsLabelledBy[(@xml:lang = $Language) or ((not(@xml:lang) or (@xml:lang = '')) and (not($Language) or ($Language = '')))]"/>
				<xsl:element name="relation">
					<xsl:element name="relationType">NT</xsl:element>
					<xsl:for-each select="$ReferencedNodeLabel">
						<xsl:element name="termId">
							<xsl:value-of select="generate-id()"/>
						</xsl:element>
					</xsl:for-each>
					<xsl:element name="termName">
						<xsl:value-of select="$ReferencedNodeLabel/bs8723:LexicalValue"/>
					</xsl:element>
					<xsl:element name="termType">
						<xsl:text>NL</xsl:text>
					</xsl:element>
					<xsl:if test="$ReferencedNodeLabel/@xml:lang">
						<xsl:element name="termLanguage">
							<xsl:value-of select="$ReferencedNodeLabel/@xml:lang"/>
						</xsl:element>
					</xsl:if>
				</xsl:element>
			</xsl:for-each>
			<xsl:variable name="SuperordinateArrays" select="/bs8723:Thesaurus/bs8723:ThesaurusArray[(bs8723:HasMember = $Concept/@dc:identifier) and (bs8723:IsLabelledBy)]"/>
			<xsl:variable name="BroaderConcepts" select="/bs8723:Thesaurus/bs8723:ThesaurusConcept[bs8723:HasHierRelConcept[starts-with(@Role, 'NT')] = $Concept/@dc:identifier]"/>
			<xsl:for-each select="$BroaderConcepts/.">
				<xsl:variable name="ReferencedTerm" select="bs8723:PreferredTerm[(@xml:lang = $Language) or ((not(@xml:lang) or (@xml:lang = '')) and (not($Language) or ($Language = '')))]"/>
				<xsl:variable name="Contains">
					<xsl:call-template name="ArraysContainsConcept">
						<xsl:with-param name="Arrays" select="$SuperordinateArrays"/>
						<xsl:with-param name="ConceptID" select="@dc:identifier"/>
					</xsl:call-template>
				</xsl:variable>
				<xsl:if test="not(contains($Contains, 'true'))">
					<xsl:element name="relation">
						<xsl:element name="relationType">BT</xsl:element>
						<xsl:element name="termId">
							<xsl:value-of select="$ReferencedTerm/@dc:identifier"/>
						</xsl:element>
						<xsl:element name="termName">
							<xsl:value-of select="$ReferencedTerm/bs8723:LexicalValue"/>
						</xsl:element>
						<xsl:element name="termType">
							<xsl:text>PT</xsl:text>
						</xsl:element>
						<xsl:if test="$ReferencedTerm/@xml:lang">
							<xsl:element name="termLanguage">
								<xsl:value-of select="$ReferencedTerm/@xml:lang"/>
							</xsl:element>
						</xsl:if>
					</xsl:element>
				</xsl:if>
			</xsl:for-each>
			<xsl:for-each select="$SuperordinateArrays/.">
				<xsl:variable name="ReferencedNodeLabel" select="bs8723:IsLabelledBy[(@xml:lang = $Language) or ((not(@xml:lang) or (@xml:lang = '')) and (not($Language) or ($Language = '')))]"/>
				<xsl:element name="relation">
					<xsl:element name="relationType">BT</xsl:element>
					<xsl:for-each select="$ReferencedNodeLabel">
						<xsl:element name="termId">
							<xsl:value-of select="generate-id()"/>
						</xsl:element>
					</xsl:for-each>
					<xsl:element name="termName">
						<xsl:value-of select="$ReferencedNodeLabel/bs8723:LexicalValue"/>
					</xsl:element>
					<xsl:element name="termType">
						<xsl:text>NL</xsl:text>
					</xsl:element>
					<xsl:if test="$ReferencedNodeLabel/@xml:lang">
						<xsl:element name="termLanguage">
							<xsl:value-of select="$ReferencedNodeLabel/@xml:lang"/>
						</xsl:element>
					</xsl:if>
				</xsl:element>
			</xsl:for-each>
			<xsl:for-each select="$Concept/bs8723:HasRelatedConcept">
				<xsl:variable name="ReferencedConceptID" select="."/>
				<xsl:variable name="ReferencedConcept" select="/bs8723:Thesaurus/bs8723:ThesaurusConcept[@dc:identifier = $ReferencedConceptID]"/>
				<xsl:variable name="ReferencedTerm" select="$ReferencedConcept/bs8723:PreferredTerm[(@xml:lang = $Language) or ((not(@xml:lang) or (@xml:lang = '')) and (not($Language) or ($Language = '')))]"/>
				<xsl:element name="relation">
					<xsl:element name="relationType">RT</xsl:element>
					<xsl:element name="termId">
						<xsl:value-of select="$ReferencedTerm/@dc:identifier"/>
					</xsl:element>
					<xsl:element name="termName">
						<xsl:value-of select="$ReferencedTerm/bs8723:LexicalValue"/>
					</xsl:element>
					<xsl:element name="termType">
						<xsl:text>PT</xsl:text>
					</xsl:element>
					<xsl:if test="$ReferencedTerm/@xml:lang">
						<xsl:element name="termLanguage">
							<xsl:value-of select="$ReferencedTerm/@xml:lang"/>
						</xsl:element>
					</xsl:if>
				</xsl:element>
			</xsl:for-each>
		</xsl:element>
	</xsl:template>
	<xsl:template match="bs8723:NonPreferredTerm">
		<xsl:param name="Concept"/>
		<xsl:variable name="Language" select="@xml:lang"/>
		<xsl:element name="term">
			<xsl:call-template name="Term">
				<xsl:with-param name="Concept" select="$Concept"/>
				<xsl:with-param name="Type">ND</xsl:with-param>
			</xsl:call-template>
			<xsl:for-each select="$Concept/bs8723:PreferredTerm[(@xml:lang = $Language) or ((not(@xml:lang) or (@xml:lang = '')) and (not($Language) or ($Language = '')))]">
				<xsl:element name="relation">
					<xsl:element name="relationType">USE</xsl:element>
					<xsl:element name="termId">
						<xsl:value-of select="@dc:identifier"/>
					</xsl:element>
					<xsl:element name="termName">
						<xsl:value-of select="bs8723:LexicalValue"/>
					</xsl:element>
					<xsl:if test="@xml:lang">
						<xsl:element name="termLanguage">
							<xsl:value-of select="@xml:lang"/>
						</xsl:element>
					</xsl:if>
				</xsl:element>
			</xsl:for-each>
		</xsl:element>
	</xsl:template>
	<xsl:template name="Term">
		<xsl:param name="Concept"/>
		<xsl:param name="Type"/>
		<xsl:variable name="Language" select="@xml:lang"/>
		<xsl:element name="termId">
			<xsl:value-of select="@dc:identifier"/>
		</xsl:element>
		<xsl:element name="termName">
			<xsl:value-of select="bs8723:LexicalValue"/>
		</xsl:element>
		<xsl:element name="termType">
			<xsl:value-of select="$Type"/>
		</xsl:element>
		<xsl:if test="@xml:lang">
			<xsl:element name="termLanguage">
				<xsl:value-of select="@xml:lang"/>
			</xsl:element>
		</xsl:if>
		<xsl:if test="$Type = 'PT'">
			<xsl:for-each select="$Concept/bs8723:ScopeNote[(@xml:lang = $Language) or ((not(@xml:lang) or (@xml:lang = '')) and (not($Language) or ($Language = '')))]/bs8723:LexicalValue">
				<xsl:element name="termNote">
					<xsl:attribute name="label">Scope</xsl:attribute>
					<xsl:value-of select="."/>
				</xsl:element>
			</xsl:for-each>
		</xsl:if>
		<xsl:for-each select="bs8723:HistoryNote/bs8723:LexicalValue">
			<xsl:element name="termNote">
				<xsl:attribute name="label">History</xsl:attribute>
				<xsl:value-of select="."/>
			</xsl:element>
		</xsl:for-each>
		<xsl:if test="dcterms:created">
			<xsl:element name="termCreatedDate">
				<xsl:value-of select="dcterms:created"/>
			</xsl:element>
		</xsl:if>
		<xsl:if test="dcterms:modified">
			<xsl:element name="termModifiedDate">
				<xsl:value-of select="dcterms:modified"/>
			</xsl:element>
		</xsl:if>
	</xsl:template>
</xsl:stylesheet>

