我正在尝试创建一个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>
答案 0 :(得分:3)
一般规则是<xs:unique>
位于最顶层的元素上,它给出了你需要唯一性的范围,选择器给出了从这一点到应该是唯一的元素的路径,以及字段( s)相对于所选元素。
因此,对于电影中的独特演员,您有一些选择。由于每个movie
只有一个cast
,而actors
只有一个actor
,您可以使用选择器actors/actor
将约束放在actors元素上,使用选择器进行转换cast/actors/actor
的选项或选项为@actorID
的电影。在所有情况下,字段xpath都是actor
,因为它与选定的maxOccurs="unbounded"
元素相关。
顺便说一下,你给出的模式只允许一部电影有一个演员,我猜你忘记了actor
内actorsAll
元素上的{{1}}。