2011-10-14 123 views
1

我正在嘗試爲具有多個名稱空間的文檔創建架構。事情是這樣的:XML架構:可擴展容器元素

<?xml version="1.0"?> 
<parent xmlns="http://myNamespace" 
     xmlns:c1="http://someone/elses/namespace" 
     xmlns:c2="http://yet/another/persons/namespace"> 

    <c1:child name="Jack"/> 
    <c2:child name="Jill"/> 
</parent> 

這是我在我的模式至今:

<xs:element name="parent" type="Parent"/> 

<xs:complexType name="Parent"> 
    <!-- don't know what to put here --> 
</xs:complexType> 

<!-- The type that child elements must extend -->   
<xs:complexType name="Child" abstract="true"> 
    <xs:attribute name="name" type="xs:string"/> 
</xs:complexType> 

的計劃是讓其他人能夠創建具有任意的子元素的文件,只要這些孩子元素擴展了我的Child類型。我的問題是:如何限制<parent>元素,使其只能包含類型爲Child類型的擴展的元素?

回答

1

我找到了答案在這裏:XML Schemas: Best Practices - Variable Content Containers

顯然你可以聲明<element> s爲abstract。一種解決方法是如下:然後

<xs:element name="parent" type="Parent"/> 

<xs:element name="child" abstract="true"/> 

<xs:complexType name="Parent"> 
    <xs:sequence> 
     <xs:element ref="child" maxOccurs="unbounded"/> 
    </xs:sequence> 
</xs:complexType> 

<xs:complexType name="Child" abstract="true"> 
    <xs:attribute name="name" type="xs:string"/> 
</xs:complexType> 

其他模式可以定義自己的孩子的類型是這樣的:

<xs:element name="child-one" substitutionGroup="child" type="ChildOne"/> 

<xs:element name="child-two" substitutionGroup="child" type="ChildTwo"/> 

<xs:complexType name="ChildOne"> 
    <xs:complexContent> 
     <xs:extension base="Child"/> 
    </xs:complexContent> 
</xs:complexType> 

<xs:complexType name="ChildTwo"> 
    <xs:complexContent> 
     <xs:extension base="Child"/> 
    </xs:complexContent> 
</xs:complexType> 

然後,我們可以有這樣的有效證件:

<parent> 
    <c1:child-one/> 
    <c1:child-two/> 
</parent> 
0

請在下面找到鏈接。這告訴我們如何繼承這些元素。

http://www.ibm.com/developerworks/library/x-flexschema/

+0

感謝鏈接。這篇文章似乎沒有涉及我後來的事情:我可以做繼承,我只是不知道如何限制'Parent'的內容,只允許其類型繼承自'Child'的元素。 – Daniel