我有 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 -> 我至少有 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>
验证通过:(好的)它没问题, enum_1 和 enum_3 (对我来说是必需的)和至少 4 个 app_name -> 验证通过
<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>
如果这些元素不存在,则验证应该失败。