2013-10-29 106 views
1

有沒有辦法在引用該類型的地方定義類型的基數?複雜類型的向量

<xs:complexType name="xyType"> 
    <xs:element name="xy" maxOccurs="1"> 
      <xs:choice maxOccurs="1" minOccurs="0"> 
       <xs:complexType> 
        <xs:choice maxOccurs="unbounded" minOccurs="0"> 
         ... 
        </xs:choice> 
       </xs:complexType> 
      </xs:element> 
     </xs:choice> 
    </xs:complexType> 

因此,例如我有兩種類型A和B具有引用此類型的元素,但在一個情況下,我只允許一個XY(如上面)和另一我想允許多個XY(例如,如果我將上面的maxOccurs更改爲「unbounded」)。

我不希望完全分離xyType(single)和xyType(unbounded)的complexType定義,因爲實際上這種類型的定義非常長且很複雜。

如果可能的話,我也不想定義太多的類型(比如將內部複雜類型與正文分開,並且有兩種類型引用該類型)。這在我的特定場景中也會非常複雜(我有一個複雜的類層次結構,我試圖用一個模式來定義,所以一切都已經臃腫了)。

所以基本上我正在尋找一種引用這種類型的類型正在關注基數,如果這是有道理的。

回答

0

這在XSD 1.0中不起作用。您可以使用Schematron(在XSD 1.0之上);它會工作沒有問題。

它可能在XSD 1.1中。這需要一些工作,至少根據我的理解。解決方案是使用斷言;然而,它們似乎只支持複雜和簡單的類型,這意味着您可能仍然需要引入特定於元素A和元素B的兩種新類型;然而,他們只是擴展xyType(100%重用),目的是提供一個地方來定義特定於A和B的斷言。

如果您對任何替代方法感興趣,請適當標記問題。

1

我建議你模塊化的xyType的部分儘可能地跨兩種類型的共享,說xyType_A,只允許一個xyxyType_B允許的xy秒的無限數量。 (當然,選擇在語義上合適的名稱,而不是這些替身。)

例如,xyType_AxyType_B可以在他們的xy的基數的定義不同但共享commonType定義的複雜機械:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:complexType name="xyType_A"> 
    <xs:sequence> 
     <xs:element name="xy" type="commonType" maxOccurs="1"/> 
    </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="xyType_B"> 
    <xs:sequence> 
     <xs:element name="xy" type="commonType" maxOccurs="unbounded"/> 
    </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="commonType"> 
    <xs:choice maxOccurs="1" minOccurs="0"> 
     <xs:sequence> 
     <xs:choice maxOccurs="unbounded" minOccurs="0"> 
      <!-- further complicated structures continue here --> 
     </xs:choice> 
     <!-- and here or wherever --> 
    </xs:sequence> 
    </xs:choice> 
    </xs:complexType> 

</xs:schema> 

如果不同基數的元素在定義層次結構中更深一些,則原則(如果不是機會的數量級)將是相同的:儘可能多地使用通用定義組件,並重用那些明確定義的類型。