你所追求的是不与XSD直接的,因为它会要求你创建三种类型(一个用于“皮波”,一为“冥王星”,一个用于其余部分),但具有相同的元素名称。根据定义,任何具有相同路径的元素必须具有相同的类型。如果您想尝试你的建议是什么,您会收到以下错误:
E [Xerces] cos-element-consistent: Error for type 'objectType'. Multiple elements with name 'object', with different types, appear in the model group.
由于所有的规则都作为基本规则,即“任何事情都会发生”,这是不可能的XSD单独1.0解决这个问题,因为它会产生含糊的元素:处理器无法知道上例中的第一个object
是“其他名称的对象”类型,还是“只有pippo/pluto”类型。这种模糊不允许(如果有人试图将模型映射到POCO或POJO上,会产生问题)。
但是,有一种解决方法。如果您可以使用XSD 1.1,则可以使用断言。例如,下面的作品(包括您的规则#3,但执行(如在你问了这句话的半句就变成没有规则可言):
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="urn:test"
targetNamespace="urn:test"
elementFormDefault="qualified"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
vc:minVersion="1.1">
<xs:element name="asset" type="objectType">
</xs:element>
<xs:complexType name="objectType">
<xs:sequence minOccurs="2" maxOccurs="unbounded">
<xs:element name="object" type="objectOtherType"/>
</xs:sequence>
<xs:assert test="object[1]/@name = 'pippo'" xpathDefaultNamespace="##targetNamespace"/>
<xs:assert test="object[2]/@name = 'pluto'" xpathDefaultNamespace="##targetNamespace"/>
<xs:assert test="every $o in object satisfies $o/@logical = $o/@name" xpathDefaultNamespace="##targetNamespace"/>
</xs:complexType>
<xs:complexType name="objectOtherType">
<xs:attribute name="name" type="otherNames" use="required" />
<xs:attribute name="logical" type="otherNames" use="required" />
</xs:complexType>
<xs:simpleType name="otherNames">
<xs:restriction base="xs:string" />
</xs:simpleType>
</xs:schema>
如果XSD 1.1是不可能的在你的情况下,你应该重新考虑你的对象模型(这可能是一个好主意),例如,通过使用具有独特属性的元素的唯一名称,以便您可以强制执行该模型。作为另一种选择,可以考虑使用RelaxNG或Schematron作为模式语言,它们都允许这种约束。您还可以将Schematron(它非常类似于XSD 1.1中的断言)与现有的XSD模式结合使用