這一切都取決於你如何定義處理模型。以下是您需要首先考慮的一些事情。
一個any
粒子不能被一個類型約束。它帶有一個名爲processContents
的屬性,該屬性可以是跳過,寬鬆,和默認,嚴格。一旦你明確瞭解它的含義,那麼跳過僅僅意味着你將無法執行你的強制屬性 - 處理器將做到這一點,「跳過」。如果你設置它不嚴格,那麼它將處理它只有在描述內容的XSD實際上是可用的,否則它將跳過;第三個選項嚴格,要求描述此額外內容的XSD可用 - 期間。
因此,any
粒子只有在驗證期間描述「any」的XSD可用時纔可以工作。我想到的選擇是有限制的,但它具有最接近任何一種「精神」的優勢,因爲它不必從特定的基本類型派生出來,或者引用一些屬性;爲此,一個類似的關鍵約束將近似您的要求:
<xsd:key name="ofid">
<xsd:selector xpath="*"/>
<xsd:field xpath="@id"/>
</xsd:key>
實際上,密鑰使該屬性爲必需。缺點可能是每個值也必須是唯一的。可能具有名爲id
的屬性,這是預期的;如果您希望將該模式應用於諸如age
之類的模式,那麼它將不起作用。
如果您決定在運行時可用的XSD是可以接受的,那麼其他選擇可能包括使用抽象元素或具有抽象類型的元素。好處是它會帶來更嚴謹的方法(您將從一開始就明確設定約束條件),並且不會限制數值約束的唯一性。缺點可能是它創建了與描述「契約」的另一個XSD的耦合 - 您的強制屬性。
更新:根據您的評論,以下是替代組的替代方案。我儘量保留舊的XSD組件名稱。
Contract.xsd:這包含您的合同的組件。它基本上描述了你的替代組的頭部;它表示需要一個id屬性。
<?xml version="1.0" encoding="utf-8" ?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:complexType name="AnyChildType" abstract="true">
<xsd:attribute name="id" use="required"/>
</xsd:complexType>
<xsd:element name="AnyElement" abstract="true" type="AnyChildType"/>
</xsd:schema>
GenericInstance.xsd:它描述了你的 「通用」 文件的根目錄。它將您的合同「整合」在您定義的根元素的上下文中。
<?xml version="1.0" encoding="utf-8" ?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:include schemaLocation="Contract.xsd"/>
<xsd:element name="AnyElements" type="AnyRootType"/>
<xsd:complexType name="AnyRootType">
<xsd:sequence>
<xsd:element ref="AnyElement" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
SpecificInstance1.xsd:特定的合同。
<?xml version="1.0" encoding="utf-8" ?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:include schemaLocation="Contract.xsd"/>
<xsd:element name="SomeElement1" substitutionGroup="AnyElement">
<xsd:complexType>
<xsd:complexContent>
<xsd:extension base="AnyChildType">
<xsd:annotation>
<xsd:documentation>Any content goes.</xsd:documentation>
</xsd:annotation>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
</xsd:schema>
SpecificInstance2.xsd:另一個合同(示出了一個不同的創作樣式)。
<?xml version="1.0" encoding="utf-8" ?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:include schemaLocation="Contract.xsd"/>
<xsd:element name="SomeElement2" substitutionGroup="AnyElement" type="SomeElement2Type"/>
<xsd:complexType name="SomeElement2Type">
<xsd:complexContent>
<xsd:extension base="AnyChildType">
<xsd:annotation>
<xsd:documentation>Any content goes.</xsd:documentation>
</xsd:annotation>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
</xsd:schema>
從視覺上來看,這是他們如何綁在一起。您可以看到XSD之間的耦合保持在最低限度。
示例XML,通過您的泛型實例定義的範圍和特定的人有效。
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<AnyElements xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SomeElement1 id="1"/>
<SomeElement2 id="1"/>
</AnyElements>
如果你限制了用一個XSD只,下面將只是針對一個XSD驗證XML:
<?xml version="1.0" encoding="utf-8" ?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:include schemaLocation="GenericInstance.xsd"/>
<xsd:include schemaLocation="SpecificInstance1.xsd"/>
<xsd:include schemaLocation="SpecificInstance2.xsd"/>
</xsd:schema>
我測試過以上XSD 1.0上運行.NET ;有能力運行XSD 1.1或其他XSD處理器中的特定功能會使我所說的某些內容失效。
我不需要這些值是唯一的。我如何去做「另類」的方式? – humansg
@humansg我已經使用基於替換組的示例更新了帖子。 –
嘿..你讓我的問題正確嗎?我希望它接受任何元素類型。意思是你可以將任何標籤名稱定義爲子標籤,但是具有標籤屬性..例如'''我測試了你的代碼,並且它正在等待超類型的東西 .. –
humansg