我想驗證兩個字段總是唯一的值,在同一個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