你所追求的是不與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模式結合使用