I have xsd validation file:
<xs:complexType name="metadata">
<xs:sequence>
<xs:element name="app_name" type="AppDataType" minOccurs="4" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="AppDataType">
<xs:attribute name="ERE" type="xs:string" use="required" />
<xs:attribute name="Name" type="AppDataName" use="required" />
<xs:attribute name="Value" type="xs:string" use="required" />
</xs:complexType>
<xs:simpleType name="AppDataName">
<xs:restriction base="xs:string">
<xs:enumeration value="enum_1" />
<xs:enumeration value="enum_2" />
<xs:enumeration value="enum_3" />
<xs:enumeration value="enum_4" />
</xs:restriction>
</xs:simpleType>
Validation works fine when app_name appear in xml less than 4 times - its ok. Problem is, when app_name appear 4 or more time but with "Name" value setup to eg enum_1, enum_2, enum_2, enum_2, enum_4 -> I have at least 4 app_name so validation is passed (elements can be repeated - its ok for me), but I need to have also enum_3 in app_name, basically I want to have (eg) enum_3 and enum_1 as a required(if not appear in xml then validation fails), but enum_2 and enum_4 as optional.
I tried:
<xs:enumeration value="enum_2" use="required"/>
but is incorrect as well as minOccurs="1".
I also tried:
<xs:complexType name="metadata">
<xs:sequence>
<xs:element name="app_name" type="AppDataType" minOccurs="4" maxOccurs="unbounded" />
<xs:element name="app_name" type="SOME_COMPLEX_TYPE_WITH_ENUM_1_AS_NAME" minOccurs="1" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
but in sequence there cannot appear two elements with same name (I cannot change this name).
So is there any way, to achive this in xs:schema version="1.0"
adding some example xml:
validation passed: (OK)
<Metadata> <app_name ERE="some_ere" Name="enum_1" Value="some_value"/> <app_name ERE="some_ere" Name="enum_2" Value="some_value"/> <app_name ERE="some_ere" Name="enum_3" Value="some_value"/> <app_name ERE="some_ere" Name="enum_4" Value="some_value"/> </Metadata>
validation passed: (OK)
<Metadata> <app_name ERE="some_ere" Name="enum_1" Value="some_value"/> <app_name ERE="some_ere" Name="enum_1" Value="some_value"/> <app_name ERE="some_ere" Name="enum_3" Value="some_value"/> <app_name ERE="some_ere" Name="enum_4" Value="some_value"/> </Metadata>
validation passed: (OK) its ok, enum_1 and enum_3 (which for me are required) and at least 4 app_name -> validation pass
<Metadata> <app_name ERE="some_ere" Name="enum_1" Value="some_value"/> <app_name ERE="some_ere" Name="enum_1" Value="some_value"/> <app_name ERE="some_ere" Name="enum_3" Value="some_value"/> <app_name ERE="some_ere" Name="enum_3" Value="some_value"/> </Metadata>
validation passed: (NOT OK - missing enum_1 which I want to be required, but right now validation is pass - xsd check only count of app_name occurs)
<Metadata> <app_name ERE="some_ere" Name="enum_2" Value="some_value"/> <app_name ERE="some_ere" Name="enum_2" Value="some_value"/> <app_name ERE="some_ere" Name="enum_3" Value="some_value"/> <app_name ERE="some_ere" Name="enum_3" Value="some_value"/> <app_name ERE="some_ere" Name="enum_4" Value="some_value"/> </Metadata>
Shortly (response to comment):
I want to have xsd validation which check if in xml document exists elements:
<metadata>
<ERE ..... name="enum_1".../>
<ERE ..... name="enum_3".../>
</metadata>
if those element not exists, then validation should fail.