2014-04-18 51 views
2

我很難理解如何爲簡單的自相似XML數據樹編寫遞歸XSD模式。
我對節點模式有一個想法,但沒有太多線索如何使模式遞歸。如何爲自相似XML樹編寫遞歸XSD模式?

這裏是XML,這是一個金融風險的規範文件的一個例子:

<CG SYM="ROOT" B="-1" S="-1"> 
    <CG SYM="IOU-AllContracts" B="100" S="100" P="100"> 
    <CG SYM="IOU100MAY14" B="-1" S="-1" P="50"/> 
    </CG> 
</CG> 

所有節點都是CG的節點,並且可以只包含CG節點,任何遞歸深度。

我想我已經計算出CG(合約/組)的節點定義,包括一些限制,我想把它放在 包含的屬性值上。 B(BuyLimit)和S(SellLimit)-1到什麼,P(位置)是任何INT,SYM(符號)不得有空格:

<xs:schema 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
targetNamespace="http://www.w3schools.com" 
xmlns="http://www.w3schools.com" 
elementFormDefault="qualified"> 

    <xs:element name="CG"> 
    <xs:complexType> 
     <xs:attribute name="SYM" type="xs:string" use="required"> 
     <xs:restriction base="xs:string"> 
     <xs:whiteSpace value="collapse"/> 
     </xs:restriction> 
     </xs:attribute> 
     <xs:attribute name="B" type="xs:integer" use="required"> 
     <xs:restriction base="xs:integer"> 
     <xs:minInclusive value="-1"> 
     </xs:restriction> 
     </xs:attribute> 
     <xs:attribute name="S" type="xs:integer" use="required"> 
     <xs:restriction base="xs:integer"> 
     <xs:minInclusive value="-1"> 
     </xs:restriction> 
     </xs:attribute> 
     <xs:attribute name="P" type="xs:integer" > 
     </xs:attribute> 
    </xs:complexType> 
    </xs:element> 

    </xs:schema> 

在此先感謝非常的任何幫助。

回答

4

您應該聲明您的CG接受可選的嵌套CG。您可以使用ref屬性來引用您的元素聲明:

<xs:element name="CG"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element ref="CG" minOccurs="0"/> 
     </xs:sequence> 
     <xs:attribute name="SYM" use="required"> 
      .... 
</xs:element> 

含有的元素聲明XSD下面將驗證您提供的樣本實例:

<xs:element name="CG"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element ref="CG" minOccurs="0"/> 
     </xs:sequence> 
     <xs:attribute name="SYM" use="required"> 
      <xs:simpleType> 
       <xs:restriction base="xs:string"> 
        <xs:whiteSpace value="collapse"/> 
       </xs:restriction> 
      </xs:simpleType> 
     </xs:attribute> 
     <xs:attribute name="B" use="required"> 
      <xs:simpleType> 
       <xs:restriction base="xs:integer"> 
        <xs:minInclusive value="-1"/> 
       </xs:restriction> 
      </xs:simpleType> 
     </xs:attribute> 
     <xs:attribute name="S" use="required"> 
      <xs:simpleType> 
       <xs:restriction base="xs:integer"> 
        <xs:minInclusive value="-1"/> 
       </xs:restriction> 
      </xs:simpleType> 
     </xs:attribute> 
     <xs:attribute name="P" type="xs:integer"/> 
    </xs:complexType> 
</xs:element> 
+0

哇,快回答!將不得不建立一個小測試項目並檢查出來,非常感謝。 –

+0

我正在做一些愚蠢的事情。我已經實現了一個小項目,並且我得到了 - 元素'CG'具有無效的子元素'CG'。 –

+0

上面的模式允許無限層次的嵌套'CG'元素,但每個級別只有一個孩子。如果每個級別需要多個子元素,請將'maxOccurs =「unbounded」'添加到嵌套的'xs:element'聲明中。 – helderdarocha