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 -> 我至少有 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. 验证通过:(好的)它没问题, 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>
    
  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>
    

很快(回复评论):

我想要 xsd 验证来检查 xml 文档中是否存在元素:

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

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

4

0 回答 0