<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
 <!--
   Copyright (c) 2016-2018 The CTAN Team
   Copyright (c) 1999-2004 Graham J. Williams

   Change history
   ==============

     2018-03-19  Manfred Lotz
       - Add an alias element which provides an alternate name for a package
     2017-10-09  Manfred Lotz
        - Made xpath in keyref 'XREF-REFID' fully generic, i.e. xref will be validated
          no matter where it is found in the XML document.
     2017-08-06  Manfred Lotz
       - Add an optional 'pseudonym' attribute to the author element
     2017-08-04  Manfred Lotz
       - Add an optional 'note' attribute to the author element
     2017-07-29  Manfred Lotz
       - Allow to add an optional date and/or note to authorref
     2017-07-24  Manfred Lotz
       - Adding the same constraint for href in <a href...> element
       - Enforce mailto: to contain a '@'
       - href in <documentation> may have one of:
         ctan:, http://, https://, or ftp://
     2017-07-23  Manfred Lotz
       - Now, in contacts element the attribute href allows
         only valid URLs. Specifically, the following URLs are
         allowed: http://, https://, ftp://, nntp:, mailto:
         or news:.
     2017-06-09  Manfred Lotz
       - added <small> for a sort of small caps
     2017-04-29  Manfred Lotz
       - removed home element which is now obsolete
     2017-04-15  Manfred Lotz
       - added contact types: announce and development
     2017-04-04  Manfred Lotz
       - the CC licenses were still wrong. Should be fixed now.
     2017-04-03  Manfred Lotz
       - mixed up '_' and '-' in license names.
         Now, we have all '-'.
     2017-04-01  Manfred Lotz
       - added licenses bsd4, gpl1, gpl1+, gpl2+, gpl3+,
         lppl1.3a and lppl1.3b
     2017-03-30  Manfred Lotz
       - added license lppl1.3c
     2017-03-29  Manfred Lotz
       - corrected a typo: "cc_by_2.0" -> "cc_by_3.0"
     2017-03-28  Manfred Lotz
       - added more Creative Commons licenses
     2017-03-26  Manfred Lotz
       - added Creative Commons licenses
     2017-01-06  Manfred Lotz
       - nested lists were not possible. Now fixed.
     2016-12-17  Manfred Lotz
       - license MIT added
     2016-12-04  Manfred Lotz
       - added a very poor man's email address validation check in the authors realm
       (finally, decided to accept ascii characters only, as 'international email addresses'
       are not widely accepted by mail servers)
       - removed obsolete emaildomain and emailname
   2016-10-29  Manfred Lotz
     - Now the description text may contain the following html elements
       - em       emphasis
       - i        italic
       - u        underline
       - b        bold
       - a        hypertext link
       - p        paragraph
       - pre      preformatted text
       - code     programming code, commands (usually in fixed fonts)
       - tt       fixed font
       - br       break or line break
       - ul       unordered list
       - ol       ordered list
       - li       list items, used in ul and ol
       - dl       descriptive or definition list
       - dt       term in definition list
       - dd       definition in definition list

   2016-10-08  Manfred Lotz
     - changed author element to be able keep more than a single email address.
       Mostly done to keep additional information for unsual situations.
       For a short while we keep the combination of emailname and emaildomain
       till this XSD schema is distributed.
   2016-07-10  Manfred Lotz
     - added support for <b/>, <i/>, <u/>
   2016-06-12  Manfred Lotz
     - Paragraph element p was defined as simple type which could
       produce an unwanted validation error in certain situations.
   2016-05-15  Manfred Lotz
     - Converted from catalogue.dtd by using the RELAX NG Compact Syntax
       and then using trang to create the XSD.
     - Documentation of the various elements was taken from the DTD
       and in many cases adjusted.
     - Added a new element contacts which will be the successor of
       of the home element

 -->
 <xs:attributeGroup name="language">
   <xs:attribute name="language">
     <xs:simpleType>
       <xs:restriction base="xs:token">
         <xs:enumeration value="aa"/>
         <xs:enumeration value="ab"/>
         <xs:enumeration value="ae"/>
         <xs:enumeration value="af"/>
         <xs:enumeration value="af-za"/>
         <xs:enumeration value="ak"/>
         <xs:enumeration value="am"/>
         <xs:enumeration value="an"/>
         <xs:enumeration value="ar"/>
         <xs:enumeration value="ar-ae"/>
         <xs:enumeration value="ar-bh"/>
         <xs:enumeration value="ar-dz"/>
         <xs:enumeration value="ar-eg"/>
         <xs:enumeration value="ar-iq"/>
         <xs:enumeration value="ar-jo"/>
         <xs:enumeration value="ar-kw"/>
         <xs:enumeration value="ar-lb"/>
         <xs:enumeration value="ar-ly"/>
         <xs:enumeration value="ar-ma"/>
         <xs:enumeration value="ar-om"/>
         <xs:enumeration value="ar-qa"/>
         <xs:enumeration value="ar-sa"/>
         <xs:enumeration value="ar-sy"/>
         <xs:enumeration value="ar-tn"/>
         <xs:enumeration value="ar-ye"/>
         <xs:enumeration value="as"/>
         <xs:enumeration value="av"/>
         <xs:enumeration value="ay"/>
         <xs:enumeration value="az"/>
         <xs:enumeration value="az-az"/>
         <xs:enumeration value="ba"/>
         <xs:enumeration value="be"/>
         <xs:enumeration value="be-by"/>
         <xs:enumeration value="bg"/>
         <xs:enumeration value="bg-bg"/>
         <xs:enumeration value="bh"/>
         <xs:enumeration value="bi"/>
         <xs:enumeration value="bm"/>
         <xs:enumeration value="bn"/>
         <xs:enumeration value="bo"/>
         <xs:enumeration value="br"/>
         <xs:enumeration value="bs-ba"/>
         <xs:enumeration value="ca"/>
         <xs:enumeration value="ca-es"/>
         <xs:enumeration value="ce"/>
         <xs:enumeration value="co"/>
         <xs:enumeration value="cr"/>
         <xs:enumeration value="cs"/>
         <xs:enumeration value="cs-cz"/>
         <xs:enumeration value="cv"/>
         <xs:enumeration value="cy"/>
         <xs:enumeration value="cy-gb"/>
         <xs:enumeration value="da"/>
         <xs:enumeration value="da-dk"/>
         <xs:enumeration value="de"/>
         <xs:enumeration value="de-at"/>
         <xs:enumeration value="de-ch"/>
         <xs:enumeration value="de-de"/>
         <xs:enumeration value="de-li"/>
         <xs:enumeration value="de-lu"/>
         <xs:enumeration value="dv"/>
         <xs:enumeration value="dv-mv"/>
         <xs:enumeration value="dz"/>
         <xs:enumeration value="ee"/>
         <xs:enumeration value="el"/>
         <xs:enumeration value="el-gr"/>
         <xs:enumeration value="en"/>
         <xs:enumeration value="en-au"/>
         <xs:enumeration value="en-bz"/>
         <xs:enumeration value="en-ca"/>
         <xs:enumeration value="en-cb"/>
         <xs:enumeration value="en-gb"/>
         <xs:enumeration value="en-ie"/>
         <xs:enumeration value="en-jm"/>
         <xs:enumeration value="en-nz"/>
         <xs:enumeration value="en-ph"/>
         <xs:enumeration value="en-tt"/>
         <xs:enumeration value="en-us"/>
         <xs:enumeration value="en-za"/>
         <xs:enumeration value="en-zw"/>
         <xs:enumeration value="eo"/>
         <xs:enumeration value="es"/>
         <xs:enumeration value="es-ar"/>
         <xs:enumeration value="es-bo"/>
         <xs:enumeration value="es-cl"/>
         <xs:enumeration value="es-co"/>
         <xs:enumeration value="es-cr"/>
         <xs:enumeration value="es-do"/>
         <xs:enumeration value="es-ec"/>
         <xs:enumeration value="es-es"/>
         <xs:enumeration value="es-gt"/>
         <xs:enumeration value="es-hn"/>
         <xs:enumeration value="es-mx"/>
         <xs:enumeration value="es-ni"/>
         <xs:enumeration value="es-pa"/>
         <xs:enumeration value="es-pe"/>
         <xs:enumeration value="es-pr"/>
         <xs:enumeration value="es-py"/>
         <xs:enumeration value="es-sv"/>
         <xs:enumeration value="es-uy"/>
         <xs:enumeration value="es-ve"/>
         <xs:enumeration value="et"/>
         <xs:enumeration value="et-ee"/>
         <xs:enumeration value="eu"/>
         <xs:enumeration value="eu-es"/>
         <xs:enumeration value="fa"/>
         <xs:enumeration value="fa-ir"/>
         <xs:enumeration value="ff"/>
         <xs:enumeration value="fi"/>
         <xs:enumeration value="fi-fi"/>
         <xs:enumeration value="fj"/>
         <xs:enumeration value="fo"/>
         <xs:enumeration value="fo-fo"/>
         <xs:enumeration value="fr"/>
         <xs:enumeration value="fr-be"/>
         <xs:enumeration value="fr-ca"/>
         <xs:enumeration value="fr-ch"/>
         <xs:enumeration value="fr-fr"/>
         <xs:enumeration value="fr-lu"/>
         <xs:enumeration value="fr-mc"/>
         <xs:enumeration value="fy"/>
         <xs:enumeration value="ga"/>
         <xs:enumeration value="gd"/>
         <xs:enumeration value="gl"/>
         <xs:enumeration value="gl-es"/>
         <xs:enumeration value="gn"/>
         <xs:enumeration value="gu"/>
         <xs:enumeration value="gu-in"/>
         <xs:enumeration value="gv"/>
         <xs:enumeration value="ha"/>
         <xs:enumeration value="he"/>
         <xs:enumeration value="he-il"/>
         <xs:enumeration value="hi"/>
         <xs:enumeration value="hi-in"/>
         <xs:enumeration value="ho"/>
         <xs:enumeration value="hr"/>
         <xs:enumeration value="hr-ba"/>
         <xs:enumeration value="hr-hr"/>
         <xs:enumeration value="ht"/>
         <xs:enumeration value="hu"/>
         <xs:enumeration value="hu-hu"/>
         <xs:enumeration value="hy"/>
         <xs:enumeration value="hy-am"/>
         <xs:enumeration value="hz"/>
         <xs:enumeration value="ia"/>
         <xs:enumeration value="id"/>
         <xs:enumeration value="id-id"/>
         <xs:enumeration value="ie"/>
         <xs:enumeration value="ig"/>
         <xs:enumeration value="ii"/>
         <xs:enumeration value="ik"/>
         <xs:enumeration value="io"/>
         <xs:enumeration value="is"/>
         <xs:enumeration value="is-is"/>
         <xs:enumeration value="it"/>
         <xs:enumeration value="it-ch"/>
         <xs:enumeration value="it-it"/>
         <xs:enumeration value="iu"/>
         <xs:enumeration value="ja"/>
         <xs:enumeration value="ja-jp"/>
         <xs:enumeration value="jv"/>
         <xs:enumeration value="ka"/>
         <xs:enumeration value="ka-ge"/>
         <xs:enumeration value="kg"/>
         <xs:enumeration value="ki"/>
         <xs:enumeration value="kj"/>
         <xs:enumeration value="kk"/>
         <xs:enumeration value="kk-kz"/>
         <xs:enumeration value="kl"/>
         <xs:enumeration value="km"/>
         <xs:enumeration value="kn"/>
         <xs:enumeration value="kn-in"/>
         <xs:enumeration value="ko"/>
         <xs:enumeration value="ko-kr"/>
         <xs:enumeration value="kok"/>
         <xs:enumeration value="kok-in"/>
         <xs:enumeration value="kr"/>
         <xs:enumeration value="ks"/>
         <xs:enumeration value="ku"/>
         <xs:enumeration value="kv"/>
         <xs:enumeration value="kw"/>
         <xs:enumeration value="ky"/>
         <xs:enumeration value="ky-kg"/>
         <xs:enumeration value="la"/>
         <xs:enumeration value="lb"/>
         <xs:enumeration value="lg"/>
         <xs:enumeration value="li"/>
         <xs:enumeration value="ln"/>
         <xs:enumeration value="lo"/>
         <xs:enumeration value="lt"/>
         <xs:enumeration value="lt-lt"/>
         <xs:enumeration value="lu"/>
         <xs:enumeration value="lv"/>
         <xs:enumeration value="lv-lv"/>
         <xs:enumeration value="mg"/>
         <xs:enumeration value="mh"/>
         <xs:enumeration value="mi"/>
         <xs:enumeration value="mi-nz"/>
         <xs:enumeration value="mk"/>
         <xs:enumeration value="mk-mk"/>
         <xs:enumeration value="ml"/>
         <xs:enumeration value="mn"/>
         <xs:enumeration value="mn-mn"/>
         <xs:enumeration value="mr"/>
         <xs:enumeration value="mr-in"/>
         <xs:enumeration value="ms"/>
         <xs:enumeration value="ms-bn"/>
         <xs:enumeration value="ms-my"/>
         <xs:enumeration value="mt"/>
         <xs:enumeration value="mt-mt"/>
         <xs:enumeration value="my"/>
         <xs:enumeration value="na"/>
         <xs:enumeration value="nb"/>
         <xs:enumeration value="nb-no"/>
         <xs:enumeration value="nd"/>
         <xs:enumeration value="ne"/>
         <xs:enumeration value="ng"/>
         <xs:enumeration value="nl"/>
         <xs:enumeration value="nl-be"/>
         <xs:enumeration value="nl-nl"/>
         <xs:enumeration value="nn-no"/>
         <xs:enumeration value="nn"/>
         <xs:enumeration value="nr"/>
         <xs:enumeration value="ns"/>
         <xs:enumeration value="ns-za"/>
         <xs:enumeration value="nv"/>
         <xs:enumeration value="ny"/>
         <xs:enumeration value="oc"/>
         <xs:enumeration value="oj"/>
         <xs:enumeration value="om"/>
         <xs:enumeration value="or"/>
         <xs:enumeration value="os"/>
         <xs:enumeration value="pa"/>
         <xs:enumeration value="pa-in"/>
         <xs:enumeration value="pi"/>
         <xs:enumeration value="pl"/>
         <xs:enumeration value="pl-pl"/>
         <xs:enumeration value="ps"/>
         <xs:enumeration value="ps-ar"/>
         <xs:enumeration value="pt"/>
         <xs:enumeration value="pt-br"/>
         <xs:enumeration value="pt-pt"/>
         <xs:enumeration value="qu"/>
         <xs:enumeration value="qu-bo"/>
         <xs:enumeration value="qu-ec"/>
         <xs:enumeration value="qu-pe"/>
         <xs:enumeration value="rm"/>
         <xs:enumeration value="rn"/>
         <xs:enumeration value="ro"/>
         <xs:enumeration value="ro-ro"/>
         <xs:enumeration value="ru"/>
         <xs:enumeration value="ru-ru"/>
         <xs:enumeration value="rw"/>
         <xs:enumeration value="sa"/>
         <xs:enumeration value="sa-in"/>
         <xs:enumeration value="sd"/>
         <xs:enumeration value="se"/>
         <xs:enumeration value="se-fi"/>
         <xs:enumeration value="se-no"/>
         <xs:enumeration value="se-se"/>
         <xs:enumeration value="si"/>
         <xs:enumeration value="sk"/>
         <xs:enumeration value="sk-sk"/>
         <xs:enumeration value="sl"/>
         <xs:enumeration value="sl-si"/>
         <xs:enumeration value="sm"/>
         <xs:enumeration value="sn"/>
         <xs:enumeration value="so"/>
         <xs:enumeration value="sq"/>
         <xs:enumeration value="sq-al"/>
         <xs:enumeration value="sr-ba"/>
         <xs:enumeration value="sr-sp"/>
         <xs:enumeration value="ss"/>
         <xs:enumeration value="st"/>
         <xs:enumeration value="su"/>
         <xs:enumeration value="sv"/>
         <xs:enumeration value="sv-fi"/>
         <xs:enumeration value="sv-se"/>
         <xs:enumeration value="sw"/>
         <xs:enumeration value="sw-ke"/>
         <xs:enumeration value="syr"/>
         <xs:enumeration value="syr-sy"/>
         <xs:enumeration value="ta"/>
         <xs:enumeration value="ta-in"/>
         <xs:enumeration value="te"/>
         <xs:enumeration value="te-in"/>
         <xs:enumeration value="tg"/>
         <xs:enumeration value="th"/>
         <xs:enumeration value="th-th"/>
         <xs:enumeration value="ti"/>
         <xs:enumeration value="tk"/>
         <xs:enumeration value="tl"/>
         <xs:enumeration value="tl-ph"/>
         <xs:enumeration value="tn"/>
         <xs:enumeration value="tn-za"/>
         <xs:enumeration value="to"/>
         <xs:enumeration value="tr"/>
         <xs:enumeration value="tr-tr"/>
         <xs:enumeration value="ts"/>
         <xs:enumeration value="tt"/>
         <xs:enumeration value="tt-ru"/>
         <xs:enumeration value="tw"/>
         <xs:enumeration value="ty"/>
         <xs:enumeration value="ug"/>
         <xs:enumeration value="uk"/>
         <xs:enumeration value="uk-ua"/>
         <xs:enumeration value="ur"/>
         <xs:enumeration value="ur-pk"/>
         <xs:enumeration value="uz"/>
         <xs:enumeration value="uz-uz"/>
         <xs:enumeration value="ve"/>
         <xs:enumeration value="vi"/>
         <xs:enumeration value="vi-vn"/>
         <xs:enumeration value="vo"/>
         <xs:enumeration value="wa"/>
         <xs:enumeration value="wo"/>
         <xs:enumeration value="xh"/>
         <xs:enumeration value="xh-za"/>
         <xs:enumeration value="yi"/>
         <xs:enumeration value="yo"/>
         <xs:enumeration value="za"/>
         <xs:enumeration value="zh"/>
         <xs:enumeration value="zh-cn"/>
         <xs:enumeration value="zh-hk"/>
         <xs:enumeration value="zh-mo"/>
         <xs:enumeration value="zh-sg"/>
         <xs:enumeration value="zh-tw"/>
         <xs:enumeration value="zu"/>
         <xs:enumeration value="zu-za"/>
       </xs:restriction>
     </xs:simpleType>
   </xs:attribute>
 </xs:attributeGroup>
 <xs:element name="fullcat">
   <xs:complexType>
     <xs:sequence>
       <xs:element ref="authors"/>
       <xs:element ref="topics"/>
       <xs:element ref="catalogue"/>
     </xs:sequence>
   </xs:complexType>

<!-- Constraints come here
    Constraints must be defined at the top level

- -->


<!-- TOPIC-ID and TOPIC-IDREF

Defines a relationship between the 'value' attribute in
element 'keyval' and the 'name' attribute in the element
'topic'
- -->
   <xs:key name="TOPIC-ID">
     <xs:selector xpath="./topics/topic"/>
     <xs:field xpath="@name"/>
   </xs:key>
   <xs:keyref name="KEYVAL-VALUE" refer="TOPIC-ID">
     <xs:selector xpath="./catalogue/entry/keyval"/>
     <xs:field xpath="@value"/>
   </xs:keyref>

<!-- AUTHOR-ID and AUTHOR-IDREF resp. UPLOADER-IDREF

Defines a relationship between the 'id' attribute in
both 'authorref' and 'uploaderref' element and the 'id'
attribute of the 'author' element.
- -->
   <xs:key name="AUTHOR-ID">
     <xs:selector xpath="./authors/author"/>
     <xs:field xpath="@id"/>
   </xs:key>
   <xs:keyref name="AUTHORREF-ID" refer="AUTHOR-ID">
     <xs:selector xpath="./catalogue/entry/authorref"/>
     <xs:field xpath="@id"/>
   </xs:keyref>
   <xs:keyref name="UPLOADERREF-ID" refer="AUTHOR-ID">
     <xs:selector xpath="./catalogue/entry/uploaderref"/>
     <xs:field xpath="@id"/>
   </xs:keyref>


<!-- PKG-ID and ALSO-IDREF resp. XREF-IDREF

Defines a relationship between the 'refid' attribute in
element 'also' and the 'id' attribute of the element
'entry'
- -->
   <xs:key name="PKG-ID">
     <xs:selector xpath="./catalogue/entry"/>
     <xs:field xpath="@id"/>
   </xs:key>
   <xs:keyref name="ALSO-REFID" refer="PKG-ID">
     <xs:selector xpath="./catalogue/entry/also"/>
     <xs:field xpath="@refid"/>
   </xs:keyref>

   <xs:keyref name="XREF-REFID" refer="PKG-ID">
     <xs:selector xpath=".//xref"/>
     <xs:field xpath="@refid"/>
   </xs:keyref>

 </xs:element>
 <!--
     <xs:selector xpath="./catalogue/entry/description/*/xref"/>
   Here is the place, i.e. before the </xs:element> line above
   where the key, keyref constraints have to be inserted manually.
   Reason is that Relax NG Compact format doesn't allow specifying
   key,keyref relationship.

 -->
 <xs:element name="authors">
   <xs:complexType>
     <xs:sequence>
       <xs:element minOccurs="0" maxOccurs="unbounded" ref="author"/>
     </xs:sequence>
   </xs:complexType>
 </xs:element>
 <!--
   author element
   We keep only one entry for each author, as a sanity measure.

   The 'id' attribute values were prefixed 'auth:'. This has
   historical reasons as in a DTD an ID resp. IDREFS has a single
   namespace. Now when using an XSD schema this is no longer a
   restriction. So we decided to get rid of the auth prefix.

   Authors names had been broken into family name and given name
   but the problems with different cultures, with what to do with the names
   of organizations, etc., proved to be too much.  The next choice was
   to have a author display name as a string and then add a string by which
   the names could be alphabetized.  (For instance, the 'auth:hefferon-j'
   may have a displayname of 'Jim Hefferon' and a collatename of
   'Hefferon Jim'.  The first letter of the collate name may be used to
   subdivide author's names into groups.)

   Initially email name and domain were separated to discourage spammers.
   Actually, we decided to reunite email name and domain into a single name
   as the authors XML file isn't visible at a web site anyway.

   pseudonym (Optional) If an author wants a pseudonym to be used for public visibility

   died  Default=false. If true indicates that an author has passed away.

   female Default=false. If true indicates the author is female.

   note  (Optional) Could be used for additional notes pertaining to the author.
 -->
 <xs:element name="author">
   <xs:complexType>
     <xs:sequence>
       <xs:element minOccurs="0" maxOccurs="unbounded" name="email">
         <xs:complexType>
           <xs:simpleContent>
             <xs:restriction base="xs:anyType">
               <xs:simpleType>
                 <xs:restriction base="xs:string">
                   <xs:pattern value="[a-zA-Z0-9+\-._]+@[a-zA-Z0-9+\-._]+"/>
                 </xs:restriction>
               </xs:simpleType>
               <xs:attribute name="inactive" type="xs:date"/>
               <xs:attribute name="note" type="xs:string"/>
             </xs:restriction>
           </xs:simpleContent>
         </xs:complexType>
       </xs:element>
     </xs:sequence>
     <xs:attribute name="id" use="required" type="xs:string"/>
     <xs:attribute name="pseudonym" type="xs:string"/>
     <xs:attribute name="familyname" type="xs:string"/>
     <xs:attribute name="givenname" type="xs:string"/>
     <xs:attribute name="female" default="false">
       <xs:simpleType>
         <xs:restriction base="xs:token">
           <xs:enumeration value="true"/>
           <xs:enumeration value="false"/>
         </xs:restriction>
       </xs:simpleType>
     </xs:attribute>
     <xs:attribute name="died" default="false">
       <xs:simpleType>
         <xs:restriction base="xs:token">
           <xs:enumeration value="true"/>
           <xs:enumeration value="false"/>
         </xs:restriction>
       </xs:simpleType>
     </xs:attribute>
     <xs:attribute name="note" type="xs:string"/>
   </xs:complexType>
 </xs:element>
 <xs:element name="topics">
   <xs:complexType>
     <xs:sequence>
       <xs:element minOccurs="0" maxOccurs="unbounded" ref="topic"/>
     </xs:sequence>
   </xs:complexType>
 </xs:element>
 <xs:element name="topic">
   <xs:complexType>
     <xs:attribute name="name" use="required" type="xs:string"/>
     <xs:attribute name="details" use="required" type="xs:string"/>
   </xs:complexType>
 </xs:element>
 <xs:element name="catalogue">
   <xs:complexType>
     <xs:sequence>
       <xs:element minOccurs="0" maxOccurs="unbounded" ref="entry"/>
     </xs:sequence>
     <xs:attribute name="maintainer" use="required" type="xs:string"/>
     <xs:attribute name="datestamp" use="required" type="xs:string"/>
     <xs:attribute name="license" use="required" type="xs:string"/>
   </xs:complexType>
   <!--
       An alias has to be unique.
   -->
   <xs:unique name="ALIAS-REFID">
     <xs:selector xpath="./entry/alias"/>
     <xs:field xpath="@id"/>
   </xs:unique>
 </xs:element>
 <xs:element name="entry">
   <xs:complexType>
     <xs:sequence>
       <xs:element ref="name"/>
       <xs:element minOccurs="0" maxOccurs="unbounded" ref="alias"/>
       <xs:element ref="caption"/>
       <xs:element minOccurs="0" maxOccurs="unbounded" ref="authorref"/>
       <xs:element minOccurs="0" maxOccurs="unbounded" ref="uploaderref"/>
       <xs:element minOccurs="0" maxOccurs="unbounded" ref="copyright"/>
       <xs:element minOccurs="0" maxOccurs="unbounded" ref="contact"/>
       <xs:element maxOccurs="unbounded" ref="license"/>
       <xs:element minOccurs="0" ref="version"/>
       <xs:element minOccurs="0" maxOccurs="unbounded" ref="also"/>
       <xs:element minOccurs="0" maxOccurs="unbounded" ref="description"/>
       <xs:element minOccurs="0" ref="installation_notes"/>
       <xs:element minOccurs="0" maxOccurs="unbounded" ref="documentation"/>
       <xs:element minOccurs="0" ref="ctan"/>
       <xs:element minOccurs="0" ref="miktex"/>
       <xs:element minOccurs="0" ref="texlive"/>
       <xs:element minOccurs="0" ref="install"/>
       <xs:element maxOccurs="unbounded" ref="keyval"/>
     </xs:sequence>
     <xs:attributeGroup ref="attlist.entry"/>
   </xs:complexType>
 </xs:element>
 <xs:attributeGroup name="attlist.entry">
   <xs:attribute name="id" use="required" type="xs:string"/>
   <xs:attribute name="datestamp" use="required" type="xs:string"/>
   <xs:attribute name="modifier" type="xs:string"/>
   <xs:attribute name="obsolete" default="false">
     <xs:simpleType>
       <xs:restriction base="xs:token">
         <xs:enumeration value="true"/>
         <xs:enumeration value="false"/>
       </xs:restriction>
     </xs:simpleType>
   </xs:attribute>
   <xs:attribute name="withdrawn" default="false">
     <xs:simpleType>
       <xs:restriction base="xs:token">
         <xs:enumeration value="true"/>
         <xs:enumeration value="false"/>
       </xs:restriction>
     </xs:simpleType>
   </xs:attribute>
 </xs:attributeGroup>
 <!--
   alias element
   An alias is an alternate name for a package

     id     an alias has an id which cannot used more than once
            Uniqueness is guaranteed by ALIAS-REFID in the catalogue
            element
     name   the display name of the alias
 -->
 <xs:element name="alias">
   <xs:complexType>
     <xs:simpleContent>
       <xs:extension base="xs:string">
         <xs:attribute name="id" use="required" type="xs:string"/>
       </xs:extension>
     </xs:simpleContent>
   </xs:complexType>
 </xs:element>
 <!--
   authorref element
   This indicates a CTAN author of a package.

     id     points to an author, who may upload on behalf of the original author(s),
            e.g. auth:wright
     date   (optional) is the date when the author was added. Date format is: yyyy-mm-dd,
            e.g. 2014-01-31
     note   (optional)
     active Specifies if an author maintains a package. False if not. Default is "true".
 -->
 <xs:element name="authorref">
   <xs:complexType>
     <xs:attribute name="id" use="required" type="xs:string"/>
     <xs:attribute name="date" type="xs:date"/>
     <xs:attribute name="note" type="xs:string"/>
     <xs:attribute name="active" default="true">
       <xs:simpleType>
         <xs:restriction base="xs:token">
           <xs:enumeration value="true"/>
           <xs:enumeration value="false"/>
         </xs:restriction>
       </xs:simpleType>
     </xs:attribute>
   </xs:complexType>
 </xs:element>
 <!--
   uploaderref element
   This indicates a CTAN author who is allowed to upload a package
   on behalf of the original author(s) of the package.

   Note: The original author (or one of the original authors) must confirm this
         in an email to [email protected]

     id     points to an author, who may upload on behalf of the original author(s),
            e.g. auth:wright
     date   is the date when the original author's confirmation email arrived at
            [email protected]. Date format is: yyyy-mm-dd, e.g. 2014-01-31
     note   (optional)
     active Currently not used, set to "true" by default.

 -->
 <xs:element name="uploaderref">
   <xs:complexType>
     <xs:attribute name="id" use="required" type="xs:string"/>
     <xs:attribute name="date" use="required" type="xs:date"/>
     <xs:attribute name="note" type="xs:string"/>
     <xs:attribute name="active" default="true">
       <xs:simpleType>
         <xs:restriction base="xs:token">
           <xs:enumeration value="true"/>
           <xs:enumeration value="false"/>
         </xs:restriction>
       </xs:simpleType>
     </xs:attribute>
   </xs:complexType>
 </xs:element>
 <xs:element name="contact">
   <xs:complexType>
     <xs:attribute name="type" use="required">
       <xs:simpleType>
         <xs:restriction base="xs:token">
           <xs:enumeration value="home"/>
           <xs:enumeration value="repository"/>
           <xs:enumeration value="support"/>
           <xs:enumeration value="bugs"/>
           <xs:enumeration value="announce"/>
           <xs:enumeration value="development"/>
         </xs:restriction>
       </xs:simpleType>
     </xs:attribute>
     <xs:attribute name="href" use="required">
       <xs:simpleType>
         <xs:restriction base="xs:string">
           <xs:pattern value="http://.*|https://.*|ftp://.*|nntp:.*|mailto:.+@.+|news:.*"/>
         </xs:restriction>
       </xs:simpleType>
     </xs:attribute>
   </xs:complexType>
 </xs:element>
 <!--
   copyright element:
   The owner and year attributes are both unstructured strings; for instance,
   year may be "1996-2005".

 -->
 <xs:element name="copyright">
   <xs:complexType>
     <xs:attribute name="owner" use="required" type="xs:string"/>
     <xs:attribute name="year" use="required" type="xs:string"/>
   </xs:complexType>
 </xs:element>
 <!--
   LICENSE

   An empty LICENSE element consists of the TYPE attribute which
   indicates the type of license under which the package is available.
   In general, UNKNOWN and OTHER licenses are specifically excluded from
   free distributions. Please refer to
   CTAN:/help/Catalogue/licenses.html, or
   http://texcatalogue.ctan.org/licenses.html, for details.

   The other attributes record details of the last time the license was
   checked, including the date (checked="2015-06-19"), the version of the
   package when the license was checked, and who checked it
   (username="manfred").

   If the TYPE is "other" then the PCDATA of the otherwise empty licence
   element might provide further explanation.

   The optional file attribute contains the name of the file where the license
   statement has been found, like "Copyright" or "doc/README", and thus
   makes checking again much easier.  The pseudo-file "header" would
   indicate that there is no separate license file, but that all included
   files state their license in their header comments. There is no
   defined syntax for that field - you like, put anything there that
   would indicate where to find the license information.

 -->
 <xs:element name="license">
   <xs:complexType>
     <xs:simpleContent>
       <xs:extension base="xs:string">
         <xs:attributeGroup ref="attlist.license"/>
       </xs:extension>
     </xs:simpleContent>
   </xs:complexType>
 </xs:element>
 <xs:attributeGroup name="attlist.license">
   <xs:attribute name="type" default="unknown">
     <xs:simpleType>
       <xs:restriction base="xs:token">
         <xs:enumeration value="apache2"/>
         <xs:enumeration value="artistic"/>
         <xs:enumeration value="artistic2"/>
         <xs:enumeration value="bsd"/>
         <xs:enumeration value="bsd2"/>
         <xs:enumeration value="bsd3"/>
         <xs:enumeration value="bsd4"/>
         <xs:enumeration value="collection"/>
         <xs:enumeration value="cc-by-1"/>
         <xs:enumeration value="cc-by-2"/>
         <xs:enumeration value="cc-by-3"/>
         <xs:enumeration value="cc-by-4"/>
         <xs:enumeration value="cc-by-nc-1"/>
         <xs:enumeration value="cc-by-nc-2"/>
         <xs:enumeration value="cc-by-nc-3"/>
         <xs:enumeration value="cc-by-nc-4"/>
         <xs:enumeration value="cc-by-nc-nd-1"/>
         <xs:enumeration value="cc-by-nc-nd-2"/>
         <xs:enumeration value="cc-by-nc-nd-2.5"/>
         <xs:enumeration value="cc-by-nc-nd-3"/>
         <xs:enumeration value="cc-by-nc-nd-4"/>
         <xs:enumeration value="cc-by-nc-sa4"/>
         <xs:enumeration value="cc-by-nd-1"/>
         <xs:enumeration value="cc-by-nd-2"/>
         <xs:enumeration value="cc-by-nd-3"/>
         <xs:enumeration value="cc-by-nd-4"/>
         <xs:enumeration value="cc-by-sa-1"/>
         <xs:enumeration value="cc-by-sa-2"/>
         <xs:enumeration value="cc-by-sa-3"/>
         <xs:enumeration value="cc-by-sa-4"/>
         <xs:enumeration value="digest"/>
         <xs:enumeration value="fdl"/>
         <xs:enumeration value="gfl"/>
         <xs:enumeration value="gfsl"/>
         <xs:enumeration value="gpl"/>
         <xs:enumeration value="gpl1"/>
         <xs:enumeration value="gpl1+"/>
         <xs:enumeration value="gpl2"/>
         <xs:enumeration value="gpl2+"/>
         <xs:enumeration value="gpl3"/>
         <xs:enumeration value="gpl3+"/>
         <xs:enumeration value="knuth"/>
         <xs:enumeration value="lgpl"/>
         <xs:enumeration value="lgpl2.1"/>
         <xs:enumeration value="lgpl3"/>
         <xs:enumeration value="lppl"/>
         <xs:enumeration value="lppl1"/>
         <xs:enumeration value="lppl1.2"/>
         <xs:enumeration value="lppl1.3"/>
         <xs:enumeration value="lppl1.3a"/>
         <xs:enumeration value="lppl1.3b"/>
         <xs:enumeration value="lppl1.3c"/>
         <xs:enumeration value="mit"/>
         <xs:enumeration value="nocommercial"/>
         <xs:enumeration value="noinfo"/>
         <xs:enumeration value="nosell"/>
         <xs:enumeration value="nosource"/>
         <xs:enumeration value="ofl"/>
         <xs:enumeration value="opl"/>
         <xs:enumeration value="other-free"/>
         <xs:enumeration value="other-nonfree"/>
         <xs:enumeration value="pd"/>
         <xs:enumeration value="shareware"/>
         <xs:enumeration value="unknown"/>
       </xs:restriction>
     </xs:simpleType>
   </xs:attribute>
   <xs:attribute name="checked" type="xs:date"/>
   <xs:attribute name="username" type="xs:string"/>
   <xs:attribute name="version" type="xs:string"/>
   <xs:attribute name="file" type="xs:string"/>
   <xs:attribute name="note" type="xs:string"/>
 </xs:attributeGroup>
 <!--
   version element
       This is the version of the package as assigned by the author.
       number   is a string
       date     if set must be a valid date
 -->
 <xs:element name="version">
   <xs:complexType>
     <xs:attribute name="number" type="xs:string"/>
     <xs:attribute name="date" type="xs:date"/>
   </xs:complexType>
 </xs:element>
 <xs:element name="also">
   <xs:complexType>
     <xs:simpleContent>
       <xs:extension base="xs:string">
         <xs:attributeGroup ref="attlist.also"/>
       </xs:extension>
     </xs:simpleContent>
   </xs:complexType>
 </xs:element>
 <xs:attributeGroup name="attlist.also">
   <xs:attribute name="refid" type="xs:string"/>
 </xs:attributeGroup>
 <xs:group name="text">
   <xs:sequence>
     <xs:choice minOccurs="0">
       <xs:element ref="xref"/>
       <xs:element ref="em"/>
       <xs:element ref="i"/>
       <xs:element ref="u"/>
       <xs:element ref="b"/>
       <xs:element ref="small"/>
       <xs:element ref="a"/>
       <xs:element ref="p"/>
       <xs:element ref="pre"/>
       <xs:element ref="code"/>
       <xs:element ref="tt"/>
       <xs:element ref="br"/>
     </xs:choice>
   </xs:sequence>
 </xs:group>
 <xs:element name="xref">
   <xs:complexType mixed="true">
     <xs:group minOccurs="0" maxOccurs="unbounded" ref="text"/>
     <xs:attributeGroup ref="attlist.xref"/>
   </xs:complexType>
 </xs:element>
 <xs:attributeGroup name="attlist.xref">
   <xs:attribute name="refid" use="required" type="xs:string"/>
 </xs:attributeGroup>
 <xs:element name="description">
   <xs:complexType mixed="true">
     <xs:choice minOccurs="0" maxOccurs="unbounded">
       <xs:group ref="text"/>
       <xs:element ref="ul"/>
       <xs:element ref="ol"/>
       <xs:element ref="dl"/>
     </xs:choice>
     <xs:attributeGroup ref="attlist.description"/>
   </xs:complexType>
 </xs:element>
 <xs:attributeGroup name="attlist.description">
   <xs:attributeGroup ref="language"/>
 </xs:attributeGroup>
 <xs:element name="em" type="xs:string"/>
 <xs:element name="b" type="xs:string"/>
 <xs:element name="i" type="xs:string"/>
 <xs:element name="u" type="xs:string"/>
 <xs:element name="small" type="xs:string"/>
 <xs:element name="p">
   <xs:complexType mixed="true">
     <xs:choice minOccurs="0" maxOccurs="unbounded">
       <xs:group ref="text"/>
       <xs:element ref="ul"/>
       <xs:element ref="ol"/>
       <xs:element ref="dl"/>
     </xs:choice>
   </xs:complexType>
 </xs:element>
 <xs:element name="pre" type="xs:string"/>
 <xs:element name="code" type="xs:string"/>
 <xs:element name="tt">
   <xs:complexType mixed="true">
     <xs:choice minOccurs="0" maxOccurs="unbounded">
       <xs:element ref="br"/>
       <xs:element ref="em"/>
     </xs:choice>
   </xs:complexType>
 </xs:element>
 <xs:element name="br">
   <xs:complexType/>
 </xs:element>
 <xs:element name="ul">
   <xs:complexType>
     <xs:sequence>
       <xs:element maxOccurs="unbounded" ref="li"/>
     </xs:sequence>
   </xs:complexType>
 </xs:element>
 <xs:element name="ol">
   <xs:complexType>
     <xs:sequence>
       <xs:element maxOccurs="unbounded" ref="li"/>
     </xs:sequence>
   </xs:complexType>
 </xs:element>
 <xs:element name="dl">
   <xs:complexType>
     <xs:sequence maxOccurs="unbounded">
       <xs:element ref="dt"/>
       <xs:element ref="dd"/>
     </xs:sequence>
   </xs:complexType>
 </xs:element>
 <xs:element name="li">
   <xs:complexType mixed="true">
     <xs:choice minOccurs="0" maxOccurs="unbounded">
       <xs:group ref="text"/>
       <xs:element ref="ul"/>
       <xs:element ref="ol"/>
       <xs:element ref="dl"/>
     </xs:choice>
   </xs:complexType>
 </xs:element>
 <xs:element name="dt">
   <xs:complexType mixed="true">
     <xs:group minOccurs="0" maxOccurs="unbounded" ref="text"/>
   </xs:complexType>
 </xs:element>
 <xs:element name="dd">
   <xs:complexType mixed="true">
     <xs:group minOccurs="0" maxOccurs="unbounded" ref="text"/>
   </xs:complexType>
 </xs:element>
 <xs:element name="email" type="xs:string"/>
 <xs:element name="name" type="xs:string"/>
 <xs:element name="number" type="xs:string"/>
 <xs:element name="released" type="xs:string"/>
 <xs:element name="caption">
   <xs:simpleType>
     <xs:union memberTypes="xs:string">
       <xs:simpleType>
         <xs:restriction base="xs:token">
           <xs:length value="0"/>
         </xs:restriction>
       </xs:simpleType>
     </xs:union>
   </xs:simpleType>
 </xs:element>
 <xs:element name="a">
   <xs:complexType>
     <xs:simpleContent>
       <xs:extension base="xs:string">
         <xs:attributeGroup ref="attlist.a"/>
       </xs:extension>
     </xs:simpleContent>
   </xs:complexType>
 </xs:element>
 <xs:attributeGroup name="attlist.a">
   <xs:attribute name="href" use="required">
     <xs:simpleType>
       <xs:restriction base="xs:string">
         <xs:pattern value="http://.*|https://.*|ftp://.*|nntp:.*|mailto:.+@.+|news:.*"/>
       </xs:restriction>
     </xs:simpleType>
   </xs:attribute>
 </xs:attributeGroup>
 <xs:element name="documentation">
   <xs:complexType>
     <xs:simpleContent>
       <xs:extension base="xs:string">
         <xs:attributeGroup ref="attlist.documentation"/>
       </xs:extension>
     </xs:simpleContent>
   </xs:complexType>
 </xs:element>
 <xs:attributeGroup name="attlist.documentation">
   <xs:attribute name="href" use="required">
     <xs:simpleType>
       <xs:restriction base="xs:string">
         <xs:pattern value="http://.*|https://.*|ftp://.*|ctan:/.*"/>
       </xs:restriction>
     </xs:simpleType>
   </xs:attribute>
   <xs:attribute name="details" type="xs:string"/>
   <xs:attributeGroup ref="language"/>
 </xs:attributeGroup>
 <!--
   installation_notes

   Optional element which may contain internal notes for the
   CTAN upload managers.

 -->
 <xs:element name="installation_notes" type="xs:string"/>
 <!--
   CTAN

   The path attribute can point to either a directory or an actual
   file. By default it is assumed to be a directory
   (i.e. file=false). The attribute zip indicates whether additionally
   to the package's directory there is a zip archive of that directory.
   By default, zip=true

 -->
 <xs:element name="ctan">
   <xs:complexType>
     <xs:attributeGroup ref="attlist.ctan"/>
   </xs:complexType>
 </xs:element>
 <xs:attributeGroup name="attlist.ctan">
   <xs:attribute name="path" use="required" type="xs:string"/>
   <xs:attributeGroup ref="language"/>
   <xs:attribute name="zip" default="true">
     <xs:simpleType>
       <xs:restriction base="xs:token">
         <xs:enumeration value="true"/>
         <xs:enumeration value="false"/>
       </xs:restriction>
     </xs:simpleType>
   </xs:attribute>
   <xs:attribute name="file" default="false">
     <xs:simpleType>
       <xs:restriction base="xs:token">
         <xs:enumeration value="true"/>
         <xs:enumeration value="false"/>
       </xs:restriction>
     </xs:simpleType>
   </xs:attribute>
 </xs:attributeGroup>
 <!--
   miktex

   If the package is part of the MiKTeX distribution then
   the MiKTeX package name is registered in attribute 'location'

 -->
 <xs:element name="miktex">
   <xs:complexType>
     <xs:attribute name="location" use="required" type="xs:string"/>
   </xs:complexType>
 </xs:element>
 <!--
   texlive

   If the package is part of the TeX Live distribution then
   the TeX Live package name is registered in attribute 'location'

 -->
 <xs:element name="texlive">
   <xs:complexType>
     <xs:attribute name="location" use="required" type="xs:string"/>
   </xs:complexType>
 </xs:element>
 <!--
   install element:
   Present if we hold a TDS-packaged version of the material.

   The 'path' attribute gives the CTAN path of the file.
   It begins with a '/', for instance, "/macros/latex/contrib/shadethm.zip".

 -->
 <xs:element name="install">
   <xs:complexType>
     <xs:attribute name="path" use="required" type="xs:string"/>
   </xs:complexType>
 </xs:element>
 <!--
   keyval

   For a history of the keyval element see the comment in catalogue.dtd.

   Currently, keyval will be used solely to assign topics, i.e attribute
   key may have value "topic" only.

 -->
 <xs:element name="keyval">
   <xs:complexType>
     <xs:attribute name="key" use="required">
       <xs:simpleType>
         <xs:restriction base="xs:token">
           <xs:enumeration value="topic"/>
         </xs:restriction>
       </xs:simpleType>
     </xs:attribute>
     <xs:attribute name="value" use="required" type="xs:string"/>
   </xs:complexType>
 </xs:element>
</xs:schema>