如何在XSD中使两个不同的元素在同一复杂类型中具有唯一值



我想验证两个字段在同一complexType中始终具有唯一值。我想在XSD中验证这一点,而不是直接在代码中进行验证。

我知道我不能在同一个complexType中使用两次类型"xs:ID",不幸的是,我无法使标记工作。

我在complexType中已经有一个使用类型"xs:ID"的属性"bookId",所以我考虑使用标记来保证另一个元素"bookName"的唯一值。

我有以下结构:

<xs:complexType name="book">
<xs:sequence>
<xs:element name = "bookName" nillable="true" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string"
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name = "bookPrice" nillable="true" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:decimal"
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
<xs:attribute name="bookId" type="xs:ID" use="required"/>
</xs:complexType>

我已经尝试了以下操作,但没有成功:

<xs:complexType name="book">
<xs:sequence>
<xs:element name = "bookName" nillable="true" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
</xs:simpleType>
<xs:unique name="uniqueBookName">
<xs:selector xpath="book"/>
<xs:field xpath="bookName"/>
</xs:unique>
</xs:element>
<xs:element name = "bookPrice" nillable="true" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:decimal"
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
<xs:attribute name="bookId" type="xs:ID" use="required"/>
</xs:complexType>

我使用的是xml版本1.0。我不知道在这里我还能做些什么来让它发挥作用。

有人对如何实现这一点有所提示吗?非常感谢。

这里需要几个答案或注释。

  1. 为什么您认为不能将类型xs:ID分配给同一复杂类型中的两个不同元素?在XSD 1.0中,为了与XML DTD兼容,禁止同一元素上有多个ID属性,但您使用的是元素,而不是属性。在XSD 1.1中,允许多个ID属性,就像允许多个子ID一样。

    除非我遗漏了一些东西(总是可能的),否则您可能不相信任何信息源告诉您xs:ID不能分配给同一复杂类型中的多个元素。当然,他们告诉你的可能是一些微妙的不同,你误解了一些细节。

  2. 如果希望使用唯一性约束而不是ID,请在其范围内ID必须唯一的元素上声明唯一性约束,而不是在book元素或bookName元素上声明。现在,您的唯一性约束指定bookName元素的字符串值在给定的bookName元素中必须是唯一的。由于bookName元素永远不能有一个以上的字符串值,因此无论是否使用xsd:unique,都将始终满足此约束。如果您希望图书名称与祖先元素bookCollection(或您所称的任何元素)唯一,请在那里声明唯一性约束。

    请注意,您可以要求图书名称是唯一的,也可以要求图书ID是唯一的;或者,没有两个元素的图书名称或图书ID与任何其他元素的图书名或图书ID相同。在第一种情况下,图书名称与某个图书ID相同并不是错误,只是与其他图书的图书名称相同。

  3. 如果你认为在现实世界中没有两本书有相同的名字,你可能需要多读一些。ISBN的发明正是因为不同的书有相同的标题并不罕见。

    如果您认为书籍名称似乎是由xs:ID类型表示的,那么您可能需要花一些时间查看书籍,同时阅读xs:ID的类型,该类型要求其值是以字母开头且不包含空格的标识符。看着我桌子上目前的书,我看不到任何一本书的标题可能是有效的xs:ID值。

    价格大多是用数值给出的,所以xsd:string作为一种数据类型可能有点松散,对于那些关心验证的人来说。

最新更新