2012-10-01 59 views
2

我能有什麼元素,如XML定義的「任何元素」。如何使用強制屬性

我該如何定義這樣的xsd?

<xs:element name="AnyElements" type="AnyRootType" /> 
<xs:complexType name="AnyRootType"> 
    <xs:sequence> 
    <xs:any type="AnyChildType" minOccurs="1" maxOccurs="unbounded"/> 
    </xs:sequence> 
</xs:complexType> 

<xs:complexType name="AnyChildType"> 
    <xs:attribute ref="id" use="required"/> 
</xs:complexType> 

<xs:attribute name="id" type="xs:string"/> 

回答

0

這一切都取決於你如何定義處理模型。以下是您需要首先考慮的一些事情。

一個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之間的耦合保持在最低限度。

enter image description here

示例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處理器中的特定功能會使我所說的某些內容失效。

+0

我不需要這些值是唯一的。我如何去做「另類」的方式? – humansg

+0

@humansg我已經使用基於替換組的示例更新了帖子。 –

+0

嘿..你讓我的問題正確嗎?我希望它接受任何元素類型。意思是你可以將任何標籤名稱定義爲子標籤,但是具有標籤屬性..例如'''我測試了你的代碼,並且它正在等待超類型的東西 .. – humansg

相關問題