我有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:
验证通过:(确定)
<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>
验证通过:(确定)
<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>
验证通过:(确定)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>
验证通过:(不行 - 缺少我想要的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>
很快(对评论的回应):
我想进行xsd验证,检查xml文档中是否存在元素:
<metadata>
<ERE ..... name="enum_1".../>
<ERE ..... name="enum_3".../>
</metadata>
如果这些元素不存在,那么验证应该失败。