2016-09-28 53 views
1

我有一種情況,我有不同的XML將具有不同類型的屬性。有時元素HEADER可能只有一個節點,或者某些XML可能具有HEADER節點中的元素和值。XSD允許simpleType和complexType內容爲相同的元素?

實施例1(HEADER只有文本):

<Details HeaderLabel="DETAILS"> 
    <HEADER Label="Header">2.5%</HEADER> 
</Details> 

實施例2(HEADER具有兩個子元素):

<Details HeaderLabel="DETAILS"> 
    <HEADER Label="Header"> 
     <HEAD Label="H1a">2.88%</HEAD> 
     <HEAD Label="H2b">3.24%</HEAD> 
    </HEADER> 
</Details> 

的XSD工作原理,以便: 這將驗證爲例1

<xs:element name="HEADER"> 
    <xs:complexType> 
     <xs:simpleContent> 
     <xs:extension base="xs:string"> 
      <xs:attribute name="Label" type="xs:string" use="required" /> 
      </xs:extension> 
     </xs:simpleContent> 
    </xs:complexType> 
</xs:element> 

這將驗證例如2

<xs:element name="HEADER"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element maxOccurs="unbounded" name="HEAD"> 
      <xs:complexType> 
      <xs:simpleContent> 
       <xs:extension base="xs:string"> 
       <xs:attribute name="Label" type="xs:string" use="required" /> 
       </xs:extension> 
      </xs:simpleContent> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    <xs:attribute name="Label" type="xs:string" use="required" /> 
    </xs:complexType> 
</xs:element> 

我嘗試使用xs:choice,但它似乎沒有正常工作,或也許我沒有關於如何實現選擇一個清醒的認識在這個情況下。

回答

0

在XSD,除非你願意通過mixed="true"有組合要素和文字,你不能讓簡單和複雜的內容。你可以使用然後使用XSD 1.1聲明來排除兩者同時出現。

但是,你在這裏游泳逆水。相反,接受,你真的有兩個不同的內容模式兩個不同的實體和不同命名不同的實體:SIMPLE_HEADERCOMPLEX_HEADER浮現在腦海。然後你可以在Details上使用xs:choice/maxOccurs="unbounded"來允許簡單和複雜的標題自由穿插。

+0

的事情是我無法改變它的實現在覈心太多的元素,它會需要很多的變化,以它的依賴的名稱。只是好奇,在這種情況下你將如何實現mixed =「true」? –

+0

在第二個'HEADER' XSD示例中,您可以將'mixed =「true」'添加到'xs:complexType'中。 – kjhughes

+0

超級工作。非常感謝 –

0

如果已經存在的情況下,你無法改變他們,你試圖寫一個XSD模式來描述他們,它必須是一個模式,它描述了所有這些,那麼你的選擇是非常有限的。據我所知,唯一的解決方案是定義HEADER混合內容 - 這是一個糟糕的解決方案。通過使用XSD 1.1聲明可以稍微改進一點(儘管不是很多)。

如果您可以刪除任何這些需求(例如,如果您可以更改實例文檔,或者您可以使用RelaxNG進行驗證,或者您可以爲每種文檔類型使用不同的模式),那麼您有一個更滿意的解決方案的機會。

相關問題