如何让两个不同的元素在XSD中具有相同复杂类型的唯一值?
我想验证两个字段总是唯一的值,在同一个complexType中。我想在我的XSD中进行验证,而不是直接在代码中进行验证。如何让两个不同的元素在XSD中具有相同复杂类型的唯一值?
我知道我不能使用类型“的xs:ID”两次相同的复杂类型里面,不幸的是我不能做标签的工作。
我已经有一个属性“BOOKID”使用型“的xs:ID”的复杂类型里面,所以我想在使用标签,以保证唯一值的其他元素“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。我不知道我可以从这里尝试什么,以便将其付诸实施。
有人对如何实现这一目标的提示?非常感谢。在这里需要
几个答案或评论。
-
为什么您认为您不能将类型xs:ID分配给同一复杂类型中的两个不同元素?在XSD 1.0中,为了与XML DTD兼容,同一元素上的多个ID属性被禁止,但您使用的是元素,而不是属性。在XSD 1.1中,允许多个ID属性,就像允许多个ID子项一样。
除非我失去了一些东西(总是可能的),你应该不信任任何的信息源告诉你的xs:ID不能分配到相同的复杂类型中的多个元素。当然,他们告诉你的东西有些微妙的不同,你误解了一些细节。
-
如果您希望使用唯一性约束条件而不是ID,请声明唯一性约束条件,该条件范围内的ID必须是唯一的,而不是book元素或bookName元素。现在,您的唯一性约束指定bookName元素的字符串值在给定的bookName元素内必须是唯一的。由于bookName元素永远不会有多个字符串值,所以这个约束条件将始终得到满足,无论是否带有xsd:unique。如果您希望书名与祖先元素bookCollection(或您称之为的任何东西)是唯一的,请在此声明唯一性约束。
请注意,您可以要求书名必须是唯一的,并且书名必须是唯一的,或者没有两个元素的书名或书名与书名或任何其他元素的书名相同。在第一种情况下,书名与某些书名相同并不是错误,只是因为它与其他书的书名相同。
-
如果你认为在现实世界中没有两本书具有相同的名称,则可能需要多出去走走。国际标准图书的发明正是因为不同的书籍具有相同的标题并不罕见。
如果您认为图书名称可能是由类型xs:ID合理表示的,那么您可能需要花一些时间查看图书,还需要阅读xs:ID类型,该类型要求其值是以一封信,不包含空格。看看我桌上目前的书,我看不到一个标题可能是有效的xs:ID值。
价格大多与数值一起给出,所以对于关心验证的人来说,xsd:string可能有点松散,因为数据类型。
首先,感谢您的回复。 1)你是对的。我从一个值得信任的来源看到了这一点:“复杂类型不能包含多个xsd:ID类型的属性,或者包含任何派生自xsd:ID的类型。”就我而言,我有一个属性和一个元素。所以我想在元素和属性中使用xs:ID并不是问题。尽管如此,我试图把类型xs:ID放在元素“bookName”中,当我测试它时没有验证值的唯一性。 2)您建议我将唯一标记从“bookName”范围中传递出来,但仍在complexType“book”中? – Amorti
不,我并不是建议你在一本书的范围内应用唯一性约束(这就是我想要描述的“书”类型)。我建议你指定唯一性约束的元素,其范围内的标识符必须是唯一的。这可能是表示书籍集合的元素,或者是出现在文档根部或其他位置的元素。但是在书中说一本书的ID必须是唯一的,这完全没有意义。 –
好吧,想象我确实有一个complexType是bookCollection。在那个complexType里面,我有一本元素书。现在想象一下,我有很多元素的type =“bookCollection”。我的想法是直接将唯一标签放在bookCollection中,这样我就可以将约束应用于书本,并且所有引用“bookCollection”类型的元素都将从这些约束中“受益”。问题是,我不能这样做。它只适用于我在父节点(具有类型bookCollection的元素)中声明唯一标记,并且最终得到许多独特标记。 – Amorti