2017-10-19 276 views
0

我想驗證兩個字段總是唯一的值,在同一個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。我不知道我可以從這裏嘗試什麼,以便將其付諸實施。

有人對如何實現這一目標的提示?非常感謝。在這裏需要

回答

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(或您稱之爲的任何東西)是唯一的,請在此聲明唯一性約束。

    請注意,您可以要求書名必須是唯一的,並且書名必須是唯一的,或者沒有兩個元素的書名或書名與書名或任何其他元素的書名相同。在第一種情況下,書名與某些書名相同並不是錯誤,只是因爲它與其他書的書名相同。

  3. 如果你認爲在現實世界中沒有兩本書具有相同的名稱,則可能需要多出去走走。國際標準圖書的發明正是因爲不同的書籍具有相同的標題並不罕見。

    如果您認爲圖書名稱可能是由類型xs:ID合理表示的,那麼您可能需要花一些時間查看圖書,還需要閱讀xs:ID類型,該類型要求其值是以一封信,不包含空格。看看我桌上目前的書,我看不到一個標題可能是有效的xs:ID值。

    價格大多與數值一起給出,所以對於關心驗證的人來說,xsd:string可能有點鬆散,因爲數據類型。

+0

首先,感謝您的回覆。 1)你是對的。我從一個值得信任的來源看到了這一點:「複雜類型不能包含多個xsd:ID類型的屬性,或者包含任何派生自xsd:ID的類型。」就我而言,我有一個屬性和一個元素。所以我想在元素和屬性中使用xs:ID並不是問題。儘管如此,我試圖把類型xs:ID放在元素「bookName」中,當我測試它時沒有驗證值的唯一性。 2)您建議我將唯一標記從「bookName」範圍中傳遞出來,但仍在complexType「book」中? – Amorti

+0

不,我並不是建議你在一本書的範圍內應用唯一性約束(這就是我想要描述的「書」類型)。我建議你指定唯一性約束的元素,其範圍內的標識符必須是唯一的。這可能是表示書籍集合的元素,或者是出現在文檔根部或其他位置的元素。但是在書中說一本書的ID必須是唯一的,這完全沒有意義。 –

+0

好吧,想象我確實有一個complexType是bookCollection。在那個complexType裏面,我有一本元素書。現在想象一下,我有很多元素的type =「bookCollection」。我的想法是直接將唯一標籤放在bookCollection中,這樣我就可以將約束應用於書本,並且所有引用「bookCollection」類型的元素都將從這些約束中「受益」。問題是,我不能這樣做。它只適用於我在父節點(具有類型bookCollection的元素)中聲明唯一標記,並且最終得到許多獨特標記。 – Amorti

相關問題