<!--
  ~ Licensed to the Apache Software Foundation (ASF) under one
  ~ or more contributor license agreements. See the NOTICE file
  ~ distributed with this work for additional information
  ~ regarding copyright ownership. The ASF licenses this file
  ~ to you under the Apache License, Version 2.0 (the
  ~ "License"); you may not use this file except in compliance
  ~ with the License. You may obtain a copy of the License at
  ~
  ~ http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~ Unless required by applicable law or agreed to in writing,
  ~ software distributed under the License is distributed on an
  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  ~ KIND, either express or implied. See the License for the
  ~ specific language governing permissions and limitations
  ~ under the License.
  -->

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:tns="http://www.w3.org/2004/06/xmlmime"
           targetNamespace="http://www.w3.org/2004/06/xmlmime" >
 <xs:attribute name="contentType" >
    <xs:simpleType>
      <xs:restriction base="xs:string" >
        <xs:pattern value="(text|application|image|audio|video|model|x-[-.a-z0-9]+)/[a-z0-9][-.+a-z0-9]+(;\s?.+=.+)*" />
      </xs:restriction>
    </xs:simpleType>
</xs:attribute>
<xs:element name="expectedMediaType" >
    <xs:simpleType>
      <xs:list itemType="tns:expectedMediaTypeItem" />
    </xs:simpleType>
</xs:element>
<xs:simpleType name="expectedMediaTypeItem" >
    <xs:restriction base="xs:string" >
        <xs:pattern value="(text|application|image|audio|video|model|x-[-.a-z0-9]+)/(([a-z0-9][-.+a-z0-9]+)|\*)" />
    </xs:restriction>
</xs:simpleType>
</xs:schema>