向XML模式中位于多个子元素内的元素添加唯一ID

时间:2013-02-20 22:41:42

标签: xml xsd schema unique

我正在尝试创建一个XML Schema,以便为位于XML中的多个子元素内的元素提供唯一的id。在这种情况下,元素是“actor”,它位于“actors”内,而“actors”又位于“cast”元素内。

我希望每个电影ID都是唯一的,并且每个演员ID在该电影ID中都是唯一的。我不确定我需要为“actor”和“cast”子元素中的“actor”元素添加“unique”。

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 Schema:

<?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>

1 个答案:

答案 0 :(得分:3)

一般规则是<xs:unique>位于最顶层的元素上,它给出了你需要唯一性的范围,选择器给出了从这一点到应该是唯一的元素的路径,以及字段( s)相对于所选元素。

因此,对于电影中的独特演员,您有一些选择。由于每个movie只有一个cast,而actors只有一个actor,您可以使用选择器actors/actor将约束放在actors元素上,使用选择器进行转换cast/actors/actor的选项或选项为@actorID的电影。在所有情况下,字段xpath都是actor,因为它与选定的maxOccurs="unbounded"元素相关。

顺便说一下,你给出的模式只允许一部电影有一个演员,我猜你忘记了actoractorsAll元素上的{{1}}。