2

XMLのいくつかの子要素内にある要素の一意のIDを持つXMLスキーマを作成しようとしています。この場合の要素は「アクター」であり、「アクター」の内部に配置され、「アクター」は「キャスト」要素の内部に配置されます。

各映画IDを一意にし、各俳優IDをその映画ID内で一意にする必要があります。「actors」と「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スキーマ:

<?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に1つだけcastあり、次に1つだけあるのでactors、セレクターを使用してactors要素に制約を設定したり、セレクターを使用actorしてキャストしたり、セレクターをactors/actor使用してムービーに制約を設定したりできますcast/actors/actor。すべての場合において、フィールドxpathは@actorID、選択したactor要素を基準にしているためです。

余談ですが、指定したスキーマでは、映画に1人の俳優しか含めることができません。内部の要素maxOccurs="unbounded"については、忘れていると思います。actoractorsAll

于 2013-02-20T23:22:55.160 に答える