2

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

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

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

1 回答 1

3

一般规则是,<xs:unique>最上面的元素给出了你需要唯一性的范围,选择器给出了从这个点到应该唯一的元素的路径,并且字段是相对于所选元素的.

因此,对于电影中的独特演员,您有几个选择。由于每个movie都有一个cast,而反过来又恰好有一个,actors您可以使用 选择器将约束放在演员元素上,使用 选择器在演员元素actoractors/actor或使用选择器 的电影上放置约束cast/actors/actor。在所有情况下,字段 xpath@actorID都是相对于所选actor元素的。

顺便说一句,你给出的模式只允许一部电影有一个演员,我猜你已经忘记了里面maxOccurs="unbounded"actor元素actorsAll

于 2013-02-20T23:22:55.160 回答