为了允许一个元素出现多次,但限制元素值只能被允许一次,我会应用“unique”元素。由于XSD 1.0中XPath的限制,我只能以低效的方式实现它。不幸的是,对我来说,XSD 1.1不是一个选项。
以下是XSD的简化版本:
这很顺利,但是却给我带来了“DIGITALARCHIVE”重复出现的错误。 问题在于这种方法强制我在每个可能的扩展
将其直接作为
如何只包含一次
以下是XSD的简化版本:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:simpleType name="DeliveryMethod">
<xs:restriction base="xs:string">
<xs:enumeration value="POST"/>
<xs:enumeration value="DIGITALARCHIVE"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="Mailpack">
<xs:sequence>
<xs:element maxOccurs="unbounded" name="deliveryMethod" type="DeliveryMethod"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Letter">
<xs:complexContent>
<xs:extension base="Mailpack">
<xs:sequence>
<xs:element name="content" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="batch">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="id" type="xs:string"/>
<xs:choice>
<xs:element maxOccurs="unbounded" name="letter" type="Letter">
<xs:unique name="oneOfEachDeliveryMethodType">
<xs:selector xpath="deliveryMethod"/>
<xs:field xpath="." />
</xs:unique>
</xs:element>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
使用以下XML:
<?xml version="1.0" encoding="utf-8"?>
<batch>
<id>123</id>
<letter>
<deliveryMethod>POST</deliveryMethod>
<deliveryMethod>DIGITALARCHIVE</deliveryMethod>
<deliveryMethod>DIGITALARCHIVE</deliveryMethod>
<content>Narf!</content>
</letter>
</batch>
这很顺利,但是却给我带来了“DIGITALARCHIVE”重复出现的错误。 问题在于这种方法强制我在每个可能的扩展
Mailpack
类型中包含unique
元素。
所以如果我例如将一个Parcel
类型引入作为Mailpack
的扩展,则必须从新的batch/parcel
元素中复制相同的unique
元素,并将其放到batch/letter
元素中。
将unique
元素纳入deliveryMethod
元素并不是一个选项,因为在XSD XPath中不允许使用父级选择器..
。<xs:complexType name="Mailpack">
<xs:sequence>
<xs:element maxOccurs="unbounded" name="deliveryMethod" type="DeliveryMethod">
<xs:unique name="oneOfEachDeliveryMethodType">
<xs:selector xpath="deliveryMethod"/>
<xs:field xpath=".." />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:complexType>
将其直接作为
batch
元素的一部分会导致相同的问题。如何只包含一次
unique
元素,但使其对Mailpack
的所有扩展都计数?(如果可能的话)