2013-02-20 57 views
2

我正在嘗試創建一個XML模式,以便在XML中的多個子元素內部存在一個元素。這種情況下的元素是「actor」,它位於「actors」內部,而「actors」又位於「cast」元素的內部。向位於XML模式中的多個子元素內的元素添加一個唯一的ID

我希望每個電影ID都是唯一的,並且每個演員ID在該電影ID中都是唯一的。我不知道我需要爲位於「演員」和「演員」子元素內的「演員」元素添加「獨特」。

XML:

<?xml version="1.0" encoding="UTF-8"?> 
<movie_database 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:noNamespaceSchemaLocation="test.xsd"> 

<movie movieID="1"> 
    <title>Movie 1</title> 
    <cast> 
     <directors>Bob</directors> 
     <writers>Tom</writers>  
     <actors> 
      <actor actorID="1"> 
       <name>Jack</name> 
      </actor> 
      <actor actorID="2"> 
       <name>James</name> 
      </actor> 
     </actors> 
    </cast> 
</movie> 
</movie_database> 

XML模式:

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

    <xs:element name="movie_database"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="movie" type="movietype" minOccurs="1" maxOccurs="unbounded"> 
       <xs:unique name="unique_actorid"> 
        <xs:selector xpath="actor"/> 
        <xs:field xpath="@actorID"/> 
       </xs:unique> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:unique name="unique_movieid"> 
     <xs:selector xpath="movie"/> 
     <xs:field xpath="@movieID"/> 
    </xs:unique> 
    </xs:element> 

    <xs:complexType name="movietype"> 
     <xs:sequence> 
      <xs:element name="title" type="xs:string"/> 
      <xs:element name="cast" type="casttype"/> 
     </xs:sequence> 
     <xs:attribute name="movieID" type="xs:integer"/> 
    </xs:complexType> 

    <xs:complexType name="casttype"> 
     <xs:sequence> 
      <xs:element name="directors" type="xs:string"/> 
      <xs:element name="writers" type="xs:string"/> 
      <xs:element name="actors" type="actorsAll"/> 
     </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="actorsAll"> 
     <xs:sequence> 
      <xs:element name="actor" type="actorType"/> 
     </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="actorType" mixed="true"> 
     <xs:sequence> 
      <xs:element name="name" type="xs:string"/> 
     </xs:sequence> 
     <xs:attribute name="actorID" type="xs:integer"/> 
    </xs:complexType> 

</xs:schema> 

回答

3

一般的規則是,<xs:unique>去,讓內你需要的唯一範圍最頂端的元素上,選擇給出的路徑從這一點到下一個應該是唯一的元素,並且該字段是相對於所選元素的。

因此,對於電影中的獨特演員,您有幾個選擇。由於每個movie恰好有一個cast,而它恰好只有一個actors,所以您可以將約束放在actors元素上,選擇器爲actor,使用選擇器actors/actor進行強制轉換,或使用選擇器cast/actors/actor選擇電影。在所有情況下,字段xpath將爲@actorID,因爲這是相對於選定的actor元素。

順便說一句,您提供的模式只允許電影有一個演員,我猜你已經忘記actorsAll內的actor元素上的maxOccurs="unbounded"

+0

這工作完美!我實際上試圖用cast/actors/actor選擇器來限制電影,但是因爲我忘記了maxOccurs =「unbounded」,我一直在獲取「這個元素不是期望的」錯誤,所以我永遠不知道是否該約束起作用。現在這一切都有道理。非常感謝! – Alex 2013-02-21 00:13:19

相關問題