<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.ascc.net/xml/schematron" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ascc.net/xml/schematron ../../Utilities/Schematron/schematron1-5.xsd" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<ns uri="http://schema.bsi-global.com/BS8723-5/" prefix="bs8723"/>
	<ns uri="http://purl.org/dc/elements/1.1/" prefix="dc"/>
	<pattern name="Consistency between arrays and concept hierarchical relationships">
		<rule context="bs8723:ThesaurusArray[count(bs8723:SuperOrdinate) != 0]/bs8723:HasMember">
			<assert test="not(/bs8723:Thesaurus/bs8723:ThesaurusArray[@dc:identifier = current()]) or (/bs8723:Thesaurus/bs8723:ThesaurusArray[(@dc:identifier = current()) and (bs8723:SuperOrdinate = current()/../@dc:identifier)])">
			Error 1: According to its array, this array needs a SuperOrdinate element.
			</assert>
			<!-- This does not work because of the facetted classification
			<assert test="not(/bs8723:Thesaurus/bs8723:ThesaurusConcept[@dc:identifier = current()]) or not(/bs8723:Thesaurus/bs8723:ThesaurusConcept[@dc:identifier = current()/../bs8723:SuperOrdinate]) or (/bs8723:Thesaurus/bs8723:ThesaurusConcept[@dc:identifier = current()]/bs8723:HasBroaderConcept = current()/../bs8723:SuperOrdinate)">
			According to its array, this concept has an incorrect broader concept.
			</assert>-->
		</rule>
		<rule context="bs8723:Thesaurus">
			<assert test="count(bs8723:ThesaurusArray[count(bs8723:SuperOrdinate) = 0]) != 0">
			Error 2: No root array.
			</assert>
		</rule>
		<!-- This does not work because of the facetted classification
		<rule context="bs8723:ThesaurusConcept[count(bs8723:HasBroaderConcept) = 0]">
			<assert test="/bs8723:Thesaurus/bs8723:ThesaurusArray[(count(bs8723:SuperOrdinate) = 0) and (bs8723:HasMember = current()/@dc:identifier)]">
			This should be a member of the root array.
			</assert>
		</rule>-->
	</pattern>
	<pattern name="Monolingual thesaurus validation">
		<rule context="bs8723:ThesaurusConcept">
			<assert test="(count(bs8723:PreferredTerm) = 1) or (count(/bs8723:Thesaurus/bs8723:SupportedLanguage) &gt; 1)">
			Error 3: It is not allowed to have more than one preferred term per concept in a thesaurus that suports only one language.
			</assert>
		</rule>
	</pattern>
	<pattern name="Consistency between narrower and broader">
		<rule context="bs8723:ThesaurusConcept/bs8723:HasBroaderConcept">
			<assert test="/bs8723:Thesaurus/bs8723:ThesaurusConcept[(@dc:identifier = current()) and (bs8723:HasNarrowerConcept = current()/../@dc:identifier)]">
			Error 4: Inconsistancy between broader and narrower
			</assert>
			<!--
			This does not work because of the recursivity of arrays
			<assert test="/bs8723:Thesaurus/bs8723:ThesaurusArray[(bs8723:HasMember = current()/../@dc:identifier) and (bs8723:SuperOrdinate = current())]">
			This concept should be in an array
			</assert>
			-->
		</rule>
		<rule context="bs8723:ThesaurusConcept/bs8723:HasNarrowerConcept">
			<assert test="/bs8723:Thesaurus/bs8723:ThesaurusConcept[(@dc:identifier = current()) and (bs8723:HasBroaderConcept = current()/../@dc:identifier)]">
			Error 5: Inconsistancy between broader and narrower
			</assert>
			<!--
			This does not work because of the recursivity of arrays
			<assert test="not(/bs8723:Thesaurus/bs8723:ThesaurusConcept[@dc:identifier = current()/../@dc:identifier]) or (/bs8723:Thesaurus/bs8723:ThesaurusArray[(bs8723:SuperOrdinate = current()/../@dc:identifier) and (bs8723:HasMember = current())])">
			This concept should be in an array
			</assert>
			-->
		</rule>
	</pattern>
	<pattern name="Consistency between USE and UF">
		<rule context="bs8723:USE">
			<assert test="../../bs8723:PreferredTerm/@dc:identifier = current()">
			Error 6: A NonPreferredTerm has an invalid value in the USE element.
			</assert>
		</rule>
		<rule context="bs8723:UF">
			<assert test="../../bs8723:NonPreferredTerm/@dc:identifier = current()">
			Error 7: A PreferredTerm has an invalid value in the UF element.
			</assert>
		</rule>
		<rule context="bs8723:NonPreferredTerm">
			<assert test="../bs8723:PreferredTerm/bs8723:UF = current()/@dc:identifier">
			Error 8: A UF is missing from the preferred term.
			</assert>
		</rule>
	</pattern>
</schema>

