2013-03-19 76 views
2

我有一個存儲電影及其演員的XML文件。有2個電影元素(+他們的movieID屬性)每個包含2個actorID。每個actorID還包含known_for/movies/movie,它也有一個movieID。XML Schema爲幾個子元素添加唯一標識

我已經設法將「主」movieID設置爲唯一,actorID在該movieID中是唯一的。不過,我也想讓known_for/movies/movie元素內的movieID在其相應的actorID內是唯一的。我在哪裏,我需要定義唯一的ID爲

known_for/movies/movie movieID 

它可能有去某處裏面<xs:element name="movies有點混亂,我只是不太清楚確切位置。

這是我的XML文件

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

<movie movieID="1"> 
    <title>Movie 1</title> 
    <cast> 
     <actors> 
      <actor actorID="1"> 
       <name>Jack</name> 
       <known_for> 
        <movies> 
         <movie movieID="1">Movie 1</movie> 
         <movie movieID="2">Movie 2</movie> 
         <movie movieID="3">Movie 3</movie> 
        </movies> 
       </known_for> 
      </actor> 
      <actor actorID="2"> 
       <name>James</name> 
       <known_for> 
        <movies> 
         <movie movieID="1">Movie 1</movie> 
         <movie movieID="2">Movie 2</movie> 
         <movie movieID="3">Movie 3</movie> 
        </movies> 
       </known_for> 
      </actor> 
     </actors> 
    </cast> 
</movie> 

<movie movieID="2"> 
    <title>Movie 2</title> 
    <cast> 
     <actors> 
      <actor actorID="1"> 
       <name>Jack</name> 
       <known_for> 
        <movies> 
         <movie movieID="1">Movie 1</movie> 
         <movie movieID="2">Movie 2</movie> 
         <movie movieID="3">Movie 3</movie> 
        </movies> 
       </known_for> 
      </actor> 
      <actor actorID="2"> 
       <name>James</name> 
       <known_for> 
        <movies> 
         <movie movieID="1">Movie 1</movie> 
         <movie movieID="2">Movie 2</movie> 
         <movie movieID="3">Movie 3</movie> 
        </movies> 
       </known_for> 
      </actor> 
     </actors> 
    </cast> 
</movie> 
</movies> 

這是我的架構

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

    <xs:element name="movies"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="movie" type="movieType" maxOccurs="unbounded"> 
        <xs:unique name="unique_actorID"> 
         <xs:selector xpath="cast/actors/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" use="required"/> 
    </xs:complexType> 

    <xs:complexType name="castType"> 
     <xs:sequence> 
      <xs:element name="actors" type="actorsAll"> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType> 

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

    <xs:complexType name="actorType"> 
     <xs:sequence> 
      <xs:element name="name" type="xs:string"/> 
      <xs:element name="known_for" type="known_forGroup" minOccurs="0"/> 
     </xs:sequence> 
     <xs:attribute name="actorID" type="xs:integer" use="required"/> 
    </xs:complexType> 

    <xs:complexType name="known_forGroup"> 
     <xs:sequence> 
      <xs:element name="movies" type="known_forType"/> 
     </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="known_forType"> 
     <xs:sequence> 
      <xs:element name="movie" type="known_forMovies" maxOccurs="unbounded"> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="known_forMovies"> 
     <xs:simpleContent> 
      <xs:extension base="xs:string"> 
       <xs:attribute name="movieID" type="xs:integer"/> 
      </xs:extension> 
     </xs:simpleContent> 
    </xs:complexType> 

</xs:schema> 

回答

1

我已經加入了獨特的ID到位於 「actorType」

裏面的 「known_for」 元素固定的問題
<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified" 
    attributeFormDefault="unqualified"> 

    <xs:element name="movies"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="movie" type="movieType" maxOccurs="unbounded"> 
        <xs:unique name="unique_actorID"> 
        <xs:selector xpath="cast/actors/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" use="required"/> 
</xs:complexType> 

<xs:complexType name="castType"> 
    <xs:sequence> 
     <xs:element name="actors" type="actorsAll"> 
     </xs:element> 
    </xs:sequence> 
</xs:complexType> 

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

<xs:complexType name="actorType"> 
    <xs:sequence> 
     <xs:element name="name" type="xs:string"/> 
     <xs:element name="known_for" type="known_forGroup" minOccurs="0"> 
      <xs:unique name="unique_known_for_movieID"> 
       <xs:selector xpath="movies/movie"/> 
       <xs:field xpath="@movieID"/> 
      </xs:unique> 
     </xs:element> 
    </xs:sequence> 
    <xs:attribute name="actorID" type="xs:integer" use="required"/> 
</xs:complexType> 

<xs:complexType name="known_forGroup"> 
    <xs:sequence> 
     <xs:element name="movies" type="known_forType"/> 
    </xs:sequence> 
</xs:complexType> 

<xs:complexType name="known_forType"> 
    <xs:sequence> 
     <xs:element name="movie" type="known_forMovies" maxOccurs="unbounded"> 
     </xs:element> 
    </xs:sequence> 
</xs:complexType> 

<xs:complexType name="known_forMovies"> 
    <xs:simpleContent> 
     <xs:extension base="xs:string"> 
      <xs:attribute name="movieID" type="xs:integer"/> 
     </xs:extension> 
    </xs:simpleContent> 
</xs:complexType> 

</xs:schema>