<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:er="urn:oasis:names:tc:entity:xmlns:xml:catalog"
           targetNamespace="urn:oasis:names:tc:entity:xmlns:xml:catalog"
           elementFormDefault="qualified">

  <!-- $Id: catalog.xsd,v 1.15 2005/10/07 13:27:08 ndw Exp $ -->

  <xs:import namespace="http://www.w3.org/XML/1998/namespace"/>

  <xs:simpleType name="pubIdChars">
    <xs:restriction base="xs:string">
      <xs:pattern value="[a-zA-Z0-9\-'\(\)+,./:=?;!*#@$_% ]*"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="publicIdentifier">
    <xs:restriction base="er:pubIdChars"/>
  </xs:simpleType>

  <xs:simpleType name="partialPublicIdentifier">
    <xs:restriction base="er:pubIdChars"/>
  </xs:simpleType>

  <xs:simpleType name="systemOrPublic">
    <xs:restriction base="xs:string">
      <xs:enumeration value="system"/>
      <xs:enumeration value="public"/>
    </xs:restriction>
  </xs:simpleType>

  <!-- The global attribute xml:base is not explicitly declared; -->
  <!-- it is allowed by the anyAttribute declarations. -->

  <xs:complexType name="catalog">
    <xs:choice minOccurs="1" maxOccurs="unbounded">
      <xs:element ref="er:public"/>
      <xs:element ref="er:system"/>
      <xs:element ref="er:uri"/>
      <xs:element ref="er:rewriteSystem"/>
      <xs:element ref="er:rewriteURI"/>
      <xs:element ref="er:uriSuffix"/>
      <xs:element ref="er:systemSuffix"/>
      <xs:element ref="er:delegatePublic"/>
      <xs:element ref="er:delegateSystem"/>
      <xs:element ref="er:delegateURI"/>
      <xs:element ref="er:nextCatalog"/>
      <xs:element ref="er:group"/>
      <xs:any namespace="##other" processContents="skip"/>
    </xs:choice>
    <xs:attribute name="id" type="xs:ID"/>
    <xs:attribute name="prefer" type="er:systemOrPublic"/>
    <xs:anyAttribute namespace="##other" processContents="lax"/>
  </xs:complexType>

  <xs:complexType name="public">
    <xs:complexContent>
      <xs:restriction base="xs:anyType">
        <xs:attribute name="publicId" type="er:publicIdentifier"
                       use="required"/>
        <xs:attribute name="uri" type="xs:anyURI" use="required"/>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:anyAttribute namespace="##other" processContents="lax"/>
      </xs:restriction>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="system">
    <xs:complexContent>
      <xs:restriction base="xs:anyType">
        <xs:attribute name="systemId" type="xs:string"
                       use="required"/>
        <xs:attribute name="uri" type="xs:anyURI" use="required"/>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:anyAttribute namespace="##other" processContents="lax"/>
      </xs:restriction>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="uri">
    <xs:complexContent>
      <xs:restriction base="xs:anyType">
        <xs:attribute name="name" type="xs:anyURI"
                       use="required"/>
        <xs:attribute name="uri" type="xs:anyURI" use="required"/>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:anyAttribute namespace="##other" processContents="lax"/>
      </xs:restriction>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="rewriteSystem">
    <xs:complexContent>
      <xs:restriction base="xs:anyType">
        <xs:attribute name="systemIdStartString"
                       type="xs:string"
                       use="required"/>
        <xs:attribute name="rewritePrefix" type="xs:string" use="required"/>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:anyAttribute namespace="##other" processContents="lax"/>
      </xs:restriction>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="rewriteURI">
    <xs:complexContent>
      <xs:restriction base="xs:anyType">
        <xs:attribute name="uriStartString"
                       type="xs:string"
                       use="required"/>
        <xs:attribute name="rewritePrefix" type="xs:string" use="required"/>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:anyAttribute namespace="##other" processContents="lax"/>
      </xs:restriction>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="systemSuffix">
    <xs:complexContent>
      <xs:restriction base="xs:anyType">
        <xs:attribute name="systemIdSuffix"
                       type="xs:string"
                       use="required"/>
        <xs:attribute name="uri" type="xs:anyURI" use="required"/>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:anyAttribute namespace="##other" processContents="lax"/>
      </xs:restriction>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="uriSuffix">
    <xs:complexContent>
      <xs:restriction base="xs:anyType">
        <xs:attribute name="uriSuffix"
                       type="xs:string"
                       use="required"/>
        <xs:attribute name="uri" type="xs:anyURI" use="required"/>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:anyAttribute namespace="##other" processContents="lax"/>
      </xs:restriction>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="delegatePublic">
    <xs:complexContent>
      <xs:restriction base="xs:anyType">
        <xs:attribute name="publicIdStartString"
                       type="er:partialPublicIdentifier"
                       use="required"/>
        <xs:attribute name="catalog" type="xs:anyURI" use="required"/>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:anyAttribute namespace="##other" processContents="lax"/>
      </xs:restriction>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="delegateSystem">
    <xs:complexContent>
      <xs:restriction base="xs:anyType">
        <xs:attribute name="systemIdStartString"
                       type="xs:string"
                       use="required"/>
        <xs:attribute name="catalog" type="xs:anyURI" use="required"/>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:anyAttribute namespace="##other" processContents="lax"/>
      </xs:restriction>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="delegateURI">
    <xs:complexContent>
      <xs:restriction base="xs:anyType">
        <xs:attribute name="uriStartString"
                       type="xs:string"
                       use="required"/>
        <xs:attribute name="catalog" type="xs:anyURI" use="required"/>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:anyAttribute namespace="##other" processContents="lax"/>
      </xs:restriction>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="nextCatalog">
    <xs:complexContent>
      <xs:restriction base="xs:anyType">
        <xs:attribute name="catalog" type="xs:anyURI" use="required"/>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:anyAttribute namespace="##other" processContents="lax"/>
      </xs:restriction>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="group">
    <xs:choice minOccurs="1" maxOccurs="unbounded">
      <xs:element ref="er:public"/>
      <xs:element ref="er:system"/>
      <xs:element ref="er:uri"/>
      <xs:element ref="er:rewriteSystem"/>
      <xs:element ref="er:rewriteURI"/>
      <xs:element ref="er:uriSuffix"/>
      <xs:element ref="er:systemSuffix"/>
      <xs:element ref="er:delegatePublic"/>
      <xs:element ref="er:delegateSystem"/>
      <xs:element ref="er:delegateURI"/>
      <xs:element ref="er:nextCatalog"/>
      <xs:any namespace="##other" processContents="skip"/>
    </xs:choice>
    <xs:attribute name="prefer" type="er:systemOrPublic"/>
    <xs:attribute name="id" type="xs:ID"/>
    <xs:anyAttribute namespace="##other" processContents="lax"/>
  </xs:complexType>

  <xs:element name="catalog" type="er:catalog"/>
  <xs:element name="public" type="er:public"/>
  <xs:element name="system" type="er:system"/>
  <xs:element name="uri" type="er:uri"/>
  <xs:element name="rewriteSystem" type="er:rewriteSystem"/>
  <xs:element name="rewriteURI" type="er:rewriteURI"/>
  <xs:element name="systemSuffix" type="er:systemSuffix"/>
  <xs:element name="uriSuffix" type="er:uriSuffix"/>
  <xs:element name="delegatePublic" type="er:delegatePublic"/>
  <xs:element name="delegateSystem" type="er:delegateSystem"/>
  <xs:element name="delegateURI" type="er:delegateURI"/>
  <xs:element name="nextCatalog" type="er:nextCatalog"/>
  <xs:element name="group" type="er:group"/>

</xs:schema>
