目前我有这个XML文件
<Vehicles>
<Car id="0" name="Kia" />
<Car id="1" name="Opel"/>
<Plane id="0" name="Airbus"/>
<Plane id="1" name="Boeing" />
</Vehicles>
及其架构:
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="VehicleType">
<xs:attribute name="id" type="xs:int" />
<xs:attribute name="name" type="xs:string" />
</xs:complexType>
<xs:element name="Vehicles">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="Car" type="VehicleType" />
<xs:element name="Plane" type="VehicleType" />
</xs:choice>
</xs:complexType>
<xs:unique name="CarIdsMustBeUnique">
<xs:selector xpath="Car" />
<xs:field xpath="@id"/>
</xs:unique>
<xs:unique name="PlaneIdsMustBeUnique">
<xs:selector xpath="Plane" />
<xs:field xpath="@id"/>
</xs:unique>
</xs:element>
正如你所看到的,我希望汽车和飞机的id是唯一的,但我必须编写两个独特的块来实现它。我可以最小化代码重复并加入xs:在一个更复杂的选择器中的唯一标识吗?因为如果我要添加另一辆车(例如火车),我将强制写出非常类似的独特区块。
我懒得写一些很独特的块:)
答案 0 :(得分:1)
在您的示例中,有一辆@ id = 0的汽车以及一张@ id = 0的飞机。这意味着有两组独立的ID,一组用于汽车,一组用于飞机,因此必须有两个独立的唯一约束。如果所有车辆的ID必须是唯一的,无论车辆类型如何,那么您就可以将约束组合成一个。