2015-05-24 78 views
-1

我有以下xml。在xsd單個字段上添加唯一約束

<Movies> 
    <Title> 
     <Platform>Hulu</Platform> 
     <PlatformID>50019855</PlatformID> 
     <UnixTimestamp>1431892827</UnixTimestamp> 
    </Title> 
    <Title> 
     <Platform>Hulu</Platform> 
     <PlatformID>50019855</PlatformID> 
     <UnixTimestamp>1431892127</UnixTimestamp> 
    </Title> 
</Movies> 

然後我有以下XSD這驗證了上面:

<?xml version="1.0" encoding="UTF-8" ?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

<xs:element name="Movies"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element name="Title" maxOccurs="unbounded"> 
     <xs:complexType> 
      <xs:sequence> 
      <xs:element name="Platform" type="xs:string"/> 
      <xs:element name="PlatformID" type="xs:string"/> 
      <xs:element name="UnixTimestamp" type="xs:positiveInteger"/> 
      </xs:sequence> 
     </xs:complexType> 
     </xs:element> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 
</xs:schema> 

我怎麼會在唯一約束增加,使得PlatformID是一個獨特的valud,如果有永遠的驗證失敗重複的值,比如在上面的xml中?

+0

***你問過同樣的問題兩次,因爲某些原因***我建議你刪除這個版本,因爲我已經花時間去改進[你的其他版本的問題](http://stackoverflow.com/q/30428140/290085),並且已經提供了比任何答案更好的答案出現在這裏。 – kjhughes

回答

0

您需要將xs:unique約定在Movies級別內,而不是Title級別內。如果是Title水平之內,它只會重複檢查節點:

XML

<Movies> 
    <Title> 
     <Platform>Hulu</Platform> 
     <PlatformID>50019855</PlatformID> 
     <UnixTimestamp>1431892827</UnixTimestamp> 
    </Title> 
    <Title> 
     <Platform>Hulu</Platform> 
     <PlatformID>50019855</PlatformID> 
     <UnixTimestamp>1431892127</UnixTimestamp> 
    </Title> 
</Movies> 

XSD

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="Movies"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="Title" maxOccurs="unbounded"> 
        <xs:complexType> 
         <xs:sequence> 
          <xs:element name="Platform" type="xs:string"/> 
          <xs:element name="PlatformID" type="xs:string" maxOccurs="unbounded"/> 
          <xs:element name="UnixTimestamp" type="xs:positiveInteger"/> 
         </xs:sequence> 
        </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
     </xs:complexType> 
     <xs:unique name="uniquePlatformID"> 
      <xs:selector xpath=".//Title/PlatformID"/> 
      <xs:field xpath="."/> 
     </xs:unique> 
    </xs:element> 
</xs:schema> 
+0

這可以工作,但對選擇器使用過於複雜的XPath。請參閱[**我的答案**](http://stackoverflow.com/a/30428722/290085)以[*您的此問題的其他副本*](http://stackoverflow.com/q/30428140/290085) (**爲什麼要問兩次?**)以更簡單的方式來表達您的唯一性約束。 – kjhughes