2013-02-20 58 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

相关问题