我需要这样的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>
我怎么能这样做,以便枚举中每个值只出现一次?
答案 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"/>