xsd validation enum element required or optional (xs:schema version 1.0 )

1.2k Views Asked by At

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:

  1. 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>
    
  2. 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>
    
  3. 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>
    
  4. 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.

0

There are 0 best solutions below