我想验证两个字段总是唯一的值,在同一个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。我不知道我可以从这里尝试什么,以便将其付诸实施。
有人对如何实现这一目标的提示?非常感谢。在这里需要
首先,感谢您的回复。 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