xsd验证枚举元素必需或可选(xs:schema version 1.0)

时间:2016-02-02 11:54:41

标签: xml validation xsd schema xsd-1.0

我有xsd验证文件:

<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>

当app_name在xml中出现少于4次时,验证工作正常 - 确定无误。 问题是,当app_name出现4次或更多次但“名称”值设置为例如enum_1,enum_2,enum_2,enum_2,enum_4 - &gt;我有至少4个app_name,所以验证通过(元素可以重复 - 对我来说没问题),但我需要在app_name中也有enum_3,基本上我想要(例如)enum_3和enum_1作为必需(如果没有出现)在xml中然后验证失败),但enum_2和enum_4是可选的。

我试过了:

<xs:enumeration value="enum_2" use="required"/>

但是不正确以及minOccurs =“1”。

我也尝试过:

    <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>

但是按顺序,不会出现两个具有相同名称的元素(我无法更改此名称)。

所以有什么方法可以在xs:schema version =“1.0”

中实现

添加一些示例xml:

  1. 验证通过:(确定)

      <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. 验证通过:(确定)

        <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. 验证通过:(确定)ok,enum_1和enum_3(对我来说是必需的)和至少4个app_name - &gt;验证通过

        <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. 验证通过:(不行 - 缺少我想要的enum_1,但现在验证通过 - xsd仅检查app_name的计数)

      <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>
    
  5. 很快(对评论的回应):

    我想进行xsd验证,检查xml文档中是否存在元素:

    <metadata>
    <ERE ..... name="enum_1".../> 
    <ERE ..... name="enum_3".../>
    </metadata>
    

    如果这些元素不存在,那么验证应该失败。

0 个答案:

没有答案