xsd:多重选择,无需重复

时间:2014-05-19 14:33:10

标签: xml xsd sequence choice repeat

我需要这样的XML:

<permission>
     <userType>Root</userType>
     <userType>Admin</userType>
 </permission>

,值来自这样的枚举:

<xs:simpleType name="USERS"> 
    <xs:restriction base="xs:string"> 
        <xs:enumeration value="Root"/> 
        <xs:enumeration value="Admin"/> 
        <xs:enumeration value="User"/> 
        <xs:enumeration value="Guest"/> 
    </xs:restriction> 
</xs:simpleType>

问题在于我现在如何接受重复的值。

<xs:element name="permission">
            <xs:complexType>
                <xs:sequence>
                    <xs:element name="userType" minOccurs="0" maxOccurs="unbounded" type="USERS"/>
                </xs:sequence>
            </xs:complexType>
        </xs:element>

我怎么能这样做,以便枚举中每个值只出现一次?

1 个答案:

答案 0 :(得分:2)

您可以为userType的内容添加唯一性约束:

<xs:element name="permission">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="userType" minOccurs="0" maxOccurs="unbounded" type="USERS"/>
        </xs:sequence>
    </xs:complexType>
    <xs:unique name="uniqueUserType">
        <xs:selector xpath="userType"/>
        <xs:field xpath="."/>
    </xs:unique>
</xs:element>

使用此约束,userType中的重复名称将无法验证:

<permission>
    <userType>Root</userType>
    <userType>Admin</userType>
    <userType>Admin</userType>
</permission>

如果你的架构声明了一个目标命名空间,你需要为它声明一个前缀,以便它可以通过XPath表达式找到它(它考虑了非前缀)即使您声明了默认命名空间,选择器也属于无命名空间。例如,您需要:

<xs:schema ... targetNamespace="my-namespace" xmlns:prefix="mynamespace"> ...

并在您的位置路径中使用该前缀:

<xs:selector xpath="prefix:userType"/>