<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified">
    <xs:element name="rat-config">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="families" maxOccurs="1" minOccurs="0">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="family" maxOccurs="unbounded" minOccurs="0">
                                <xs:complexType>
                                    <xs:attribute name="id" type="xs:string" use="required"/>
                                    <xs:attribute name="name" type="xs:string" use="required"/>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element name="licenses" maxOccurs="1" minOccurs="0">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="license" maxOccurs="unbounded" minOccurs="0">
                                <xs:complexType>
                                    <xs:choice maxOccurs="unbounded" minOccurs="1">
                                        <xs:element ref="matcher" maxOccurs="1" minOccurs="1"/>
                                        <xs:element name="note" type="xs:string" minOccurs="0" maxOccurs="1"/>
                                    </xs:choice>
                                    <xs:attribute name="family" form="unqualified" use="required"/>
                                    <xs:attribute name="id" form="unqualified" use="optional"/>
                                    <xs:attribute name="name" form="unqualified" use="optional"/>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element name="approved" maxOccurs="1" minOccurs="0">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="family" maxOccurs="unbounded" minOccurs="0">
                                <xs:complexType>
                                    <xs:attribute name="license_ref" type="xs:string" use="required"/>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element name="matchers" maxOccurs="1" minOccurs="0">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="matcher" maxOccurs="unbounded" minOccurs="0">
                                <xs:complexType>
                                    <xs:attribute name="class" type="xs:string" use="required"/>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="matcher" abstract="true"/>
    <xs:element name="all" substitutionGroup="matcher">
        <xs:complexType>
            <xs:choice>
                <xs:element ref="matcher" maxOccurs="unbounded" minOccurs="0"/>
            </xs:choice>
            <xs:attribute name="id" form="unqualified" use="optional"/>
            <xs:attribute name="resource" form="unqualified" use="optional"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="matcherRef" substitutionGroup="matcher">
        <xs:complexType>
            <xs:attribute name="refId" form="unqualified" use="required"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="copyright" substitutionGroup="matcher">
        <xs:complexType>
            <xs:attribute name="end" form="unqualified" use="optional"/>
            <xs:attribute name="id" form="unqualified" use="optional"/>
            <xs:attribute name="owner" form="unqualified" use="optional"/>
            <xs:attribute name="start" form="unqualified" use="optional"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="not" substitutionGroup="matcher">
        <xs:complexType>
            <xs:choice>
                <xs:element ref="matcher" maxOccurs="1" minOccurs="1"/>
            </xs:choice>
            <xs:attribute name="id" form="unqualified" use="optional"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="regex" substitutionGroup="matcher">
        <xs:complexType>
            <xs:attribute name="expression" form="unqualified" use="optional"/>
            <xs:attribute name="id" form="unqualified" use="optional"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="spdx" substitutionGroup="matcher">
        <xs:complexType>
            <xs:attribute name="id" form="unqualified" use="optional"/>
            <xs:attribute name="name" form="unqualified" use="optional"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="text" substitutionGroup="matcher">
        <xs:complexType>
            <xs:simpleContent>
                <xs:extension base="xs:string">
                    <xs:attribute name="id" form="unqualified" use="optional"/>
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
    </xs:element>
    <xs:element name="any" substitutionGroup="matcher">
        <xs:complexType>
            <xs:choice>
                <xs:element ref="matcher" maxOccurs="unbounded" minOccurs="0"/>
            </xs:choice>
            <xs:attribute name="id" form="unqualified" use="optional"/>
            <xs:attribute name="resource" form="unqualified" use="optional"/>
        </xs:complexType>
    </xs:element>
</xs:schema>
