<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://josm.openstreetmap.de/tagging-preset-1.0"
	xmlns:tns="http://josm.openstreetmap.de/tagging-preset-1.0"
	elementFormDefault="qualified">

	<!-- Localized attributes (for example de.description are not supported
		by xsd, so every element needs <anyAttribute/> To cover at least some common
		errors, elements have specified prohibited attributes -->

	<element name="annotations" type="tns:root" />
	<element name="presets" type="tns:root">
		<unique name="chunk_id">
			<selector xpath=".//tns:chunk"/>
			<field xpath="@id"/>
		</unique>
		<keyref name="chunk_ref" refer="tns:chunk_id">
			<selector xpath=".//tns:reference"/>
			<field xpath="@ref"/>
		</keyref>
	</element>

	<complexType name="root">
		<complexContent>
			<extension base="tns:group-parent">
				<attribute name="author" type="string" />
				<attribute name="version" type="string" />
				<attribute name="shortdescription" type="string" />
				<attribute name="description" type="string" />
				<attribute name="link" type="string" />
				<attribute name="baselanguage" type="string" />

				<anyAttribute processContents="skip" />
			</extension>
		</complexContent>
	</complexType>

	<complexType name="group-parent">
		<sequence>
			<choice minOccurs="1" maxOccurs="unbounded">
				<element name="chunk" type="tns:chunk"/>
				<element name="group" type="tns:group" />
				<element name="item" type="tns:item" />
				<element name="separator" type="tns:separator" />
			</choice>
		</sequence>
		<attribute name="icon" type="string" />

		<attribute name="type" use="prohibited" />
		<attribute name="text" use="prohibited" />
		<anyAttribute processContents="skip" />
	</complexType>

	<complexType name="group">
		<complexContent>
			<extension base="tns:group-parent">
				<attribute name="name" type="string" use="required" />
			</extension>
		</complexContent>
	</complexType>

	<complexType name="separator" />

	<complexType name="item">
		<sequence>
			<choice minOccurs="0" maxOccurs="unbounded">
				<group ref="tns:optional_elements" />
				<element name="key" type="tns:key" />
				<element name="optional" type="tns:optional" minOccurs="0" />
			</choice>
			<element name="roles" type="tns:roles" minOccurs="0" maxOccurs="1" />
		</sequence>
		<attribute name="name" type="string" use="required" />
		<attribute name="icon" type="string" />
		<attribute name="type" type="string" />
		<attribute name="name_template" type="string"/>
		<attribute name="name_template_filter" type="string"/>
		<attribute name="preset_name_label" type="boolean"/>

		<attribute name="text" use="prohibited" />
		<anyAttribute processContents="skip" />
	</complexType>

	<complexType name="optional">
		<group ref="tns:optional_elements" maxOccurs="unbounded" />
		<attribute name="text" type="string" />
		<attribute name="text_context" type="string" />
	</complexType>

	<complexType name="chunk">
		<choice minOccurs="1" maxOccurs="1">
			<sequence>
				<choice minOccurs="1" maxOccurs="unbounded">
					<group ref="tns:optional_elements" />
					<element name="key" type="tns:key" />
					<element name="optional" type="tns:optional" minOccurs="0" />
				</choice>
			</sequence>
			<sequence>
				<!-- Cannot use tns:list_elements here because reference is present both in optional_elements and list_elements
				so it violates cos-nonambig: Unique Particle Attribution :
				<group ref="tns:list_elements" minOccurs="1" maxOccurs="unbounded" />-->
				<element name="list_entry" type="tns:list_entry" minOccurs="1" maxOccurs="unbounded" />
			</sequence>
		</choice>
		<attribute name="id" type="ID" use="required" />
	</complexType>

	<complexType name="reference">
		<attribute name="ref" type="IDREF" use="required" />
	</complexType>

	<group name="optional_elements">
		<choice>
			<element name="label" type="tns:label" />
			<element name="space" type="tns:space" />
			<element name="link" type="tns:link" />
			<element name="preset_link" type="tns:preset_link" />
			<element name="text" type="tns:text" />
			<element name="combo" type="tns:combo" />
			<element name="multiselect" type="tns:multiselect" />
			<element name="checkgroup" type="tns:checkgroup" />
			<element name="check" type="tns:check" />
			<element name="item_separator" type="tns:separator" />
			<element name="reference" type="tns:reference" />
		</choice>
	</group>

	<group name="list_elements">
		<choice>
			<element name="list_entry" type="tns:list_entry" />
			<element name="reference" type="tns:reference" />
		</choice>
	</group>

	<complexType name="key">
		<attribute name="key" type="string" use="required" />
		<attribute name="value" type="string" />
		<attribute name="match" type="string" />
	</complexType>

	<complexType name="link">
		<attribute name="href" type="string" use="required" />
		<attribute name="text" type="string" />
		<attribute name="text_context" type="string" />

		<attribute name="name" use="prohibited" />
		<anyAttribute processContents="skip" />
	</complexType>

	<complexType name="preset_link">
		<attribute name="preset_name" type="string" use="required" />
		<attribute name="name" use="prohibited" />
	</complexType>

	<complexType name="label">
		<attribute name="text" type="string" use="required" />
		<attribute name="text_context" type="string" />
		<attribute name="icon" type="string" />
		<attribute name="icon_size" type="integer" />

		<attribute name="name" use="prohibited" />
		<anyAttribute processContents="skip" />
	</complexType>

	<complexType name="space" />

	<complexType name="text">
		<attribute name="key" type="string" use="required" />
		<attribute name="text" type="string" />
		<attribute name="text_context" type="string" />
		<attribute name="default" type="string" />
		<attribute name="use_last_as_default" type="tns:last_default" />
		<attribute name="auto_increment" type="string" />
		<attribute name="match" type="tns:match" />
		<attribute name="length" type="positiveInteger" />
		<attribute name="alternative_autocomplete_keys" type="string" />

		<attribute name="type" use="prohibited" />
		<attribute name="name" use="prohibited" />
		<attribute name="value" use="prohibited" />
		<attribute name="values" use="prohibited" />
		<anyAttribute processContents="skip" />
	</complexType>

	<complexType name="list_entry">
		<attribute name="value" type="string" use="required" />
		<attribute name="value_context" type="string" />
		<attribute name="display_value" type="string" />
		<attribute name="short_description" type="string" />
		<attribute name="icon" type="string" />
		<attribute name="icon_size" type="integer" />
		<anyAttribute processContents="skip" />
	</complexType>

	<complexType name="combo">
		<!-- use either list_entry's or a combination of values/display_values -->
		<sequence>
			<group ref="tns:list_elements" minOccurs="0" maxOccurs="unbounded" />
		</sequence>
		<attribute name="key" type="string" use="required" />
		<attribute name="text" type="string" />
		<attribute name="text_context" type="string" />
		<attribute name="values" type="string" />
		<attribute name="values_from" type="string" />
		<attribute name="values_context" type="string" />
		<attribute name="values_no_i18n" type="boolean" />
		<attribute name="values_sort" type="boolean" />
		<attribute name="display_values" type="string" />
		<attribute name="values_searchable" type="boolean" />
		<attribute name="default" type="string" />
		<attribute name="use_last_as_default" type="tns:last_default" />
		<attribute name="delimiter" type="string" />
		<attribute name="editable" type="boolean" />
		<attribute name="match" type="tns:match" />
		<attribute name="length" type="positiveInteger" />

		<attribute name="type" use="prohibited" />
		<attribute name="value" use="prohibited" />
		<attribute name="name" use="prohibited" />
		<attribute name="delete-if-empty" use="prohibited" />
		<attribute name="display-values" use="prohibited" />
		<anyAttribute processContents="skip" />
	</complexType>

	<complexType name="multiselect">
		<!-- use either list_entry's or a combination of values/display_values -->
		<sequence>
			<group ref="tns:list_elements" minOccurs="0" maxOccurs="unbounded" />
		</sequence>
		<attribute name="key" type="string" use="required" />
		<attribute name="text" type="string" />
		<attribute name="text_context" type="string" />
		<attribute name="values" type="string" />
		<attribute name="values_from" type="string" />
		<attribute name="values_context" type="string" />
		<attribute name="display_values" type="string" />
		<attribute name="values_searchable" type="boolean" />
		<attribute name="default" type="string" />
		<attribute name="use_last_as_default" type="tns:last_default" />
		<attribute name="delimiter" type="string" />
		<attribute name="match" type="tns:match" />

		<attribute name="type" use="prohibited" />
		<attribute name="value" use="prohibited" />
		<attribute name="name" use="prohibited" />
		<attribute name="delete-if-empty" use="prohibited" />
		<attribute name="display-values" use="prohibited" />
		<anyAttribute processContents="skip" />
	</complexType>

	<complexType name="checkgroup">
		<sequence>
			<choice minOccurs="1" maxOccurs="unbounded">
				<element name="check" type="tns:check" />
			</choice>
		</sequence>
		<attribute name="columns" type="positiveInteger" />
		<anyAttribute processContents="skip" />
	</complexType>

	<complexType name="check">
		<attribute name="key" type="string" use="required" />
		<attribute name="text" type="string" />
		<attribute name="text_context" type="string" />
		<attribute name="default" type="tns:check_default" />
		<attribute name="value_on" type="string" />
		<attribute name="value_off" type="string" />
		<attribute name="disable_off" type="boolean" />
		<attribute name="match" type="tns:match" />

		<attribute name="name" use="prohibited" />
		<attribute name="type" use="prohibited" />
		<attribute name="value" use="prohibited" />
		<anyAttribute processContents="skip" />
	</complexType>

	<simpleType name="check_default">
		<restriction base="string">
			<enumeration value="on" />
			<enumeration value="off" />
		</restriction>
	</simpleType>

	<simpleType name="last_default">
		<restriction base="string">
			<enumeration value="true" />
			<enumeration value="false" />
			<enumeration value="force" />
		</restriction>
	</simpleType>

	<simpleType name="match">
		<restriction base="string">
			<enumeration value="none" />
			<enumeration value="key" />
			<enumeration value="key!" />
			<enumeration value="keyvalue" />
            <enumeration value="keyvalue!" />
		</restriction>
	</simpleType>

	<complexType name="roles">
		<sequence>
			<element name="role" type="tns:role" minOccurs="1" maxOccurs="unbounded" />
		</sequence>
	</complexType>

	<complexType name="role">
		<attribute name="key" type="string" />
		<attribute name="text" type="string" />
		<attribute name="text_context" type="string" />
		<attribute name="requisite" type="tns:role_requisite" />
		<attribute name="type" type="string" />
		<attribute name="count" type="integer" />
		<attribute name="member_expression" type="string" />
		<anyAttribute processContents="skip" />
	</complexType>

	<simpleType name="role_requisite">
		<restriction base="string">
			<enumeration value="required" />
			<enumeration value="optional" />
		</restriction>
	</simpleType>

</schema>
