2010-03-22 84 views
0

我在爲某些xml創建XSD時遇到問題。用於遞歸XML的XSD模式

有點背景可能會有所幫助。 xml用於消息傳遞。特別是,消息 被設計得很簡單,並且被設計爲易於交叉引用。其核心 是一個遞歸鍵值設置。

簡單的鍵值是這樣的。

<key name="quantity">5</key> 
    <key name="price" representation="percentage">99.78</key> 

有其中infromation 可以以兩種不同的形式來表示一個可選的表示屬性。

參考鍵值這樣

<key name="currency" reference="instrument"> 
     <id name=" INSID" system="XXXX" instance="PROD">DEM</id> 
     <id name=" EXTERN_ID1" system="XXXX" instance="PROD"> ext128k</id> 
    </key> 

這種形式用於外鍵引用或用於枚舉引用。 交叉引用服務將選擇具有引用屬性的所有密鑰。 然後,它將獲得該引用的所有可能的id,並添加額外的ID 字段,並用新版本替換該子元素。

即「./key[@reference]」作爲一個XPath可以從XML

得到所有的枚舉和引用 最後是一個遞歸結構。這裏,鍵值 的值部分本身可以是關鍵值。

<key name="trade" type="trade"> 
    <key name="value_day">1999-03-12</key> 
    <key name="quantity">5</key> 
    <key name="leg" type="leg"> 
     <key name="rate">5.00</key> 
     <key name="period">3m</key> 
     <key name="cashflows" type="cashflows"> 
      <key name="cashflow">10</key> 
      <key name="cashflow">20</key> 
     </key> 
    </key> 
</key> 

現在,我在創建此結構的XSD時遇到了麻煩。

任何人都可以幫忙嗎?

感謝

尼克

+0

執行前兩個XML片段有任何相關性,您的問題,或第三遞歸結構? – 2010-03-22 11:31:47

+0

如果我把它作爲一個對象修改,我會得到這個。 鍵值 SimpleKeyValue繼承KEYVALUE ReferenceKeyValue繼承KEYVALUE ListKeyValue繼承KEYVALUE 尼克 – Nickle 2010-03-22 12:24:12

回答

2

如果我理解正確的,你希望你能寫模式是這樣的:

<!-- WARNING: this is not valid Schema --> 
<xs:complexType name="composite-key"> 
    <xs:choice maxOccurs="unbounded"> 
    <xs:element name="key" type="simple-key"/> 
    <xs:element name="key" type="composite-key"/> 
    </xs:choice> 
    <xs:attribute name="name" type="xs:string" use="required"/> 
</xs:complexType> 

簡單的鍵將定義在別處。這是無效的Schema,因爲您不允許使用兩次相同的元素名稱。如果Schema支持這一點,那麼它將有一段時間根據它們的結構來消除單元類型的歧義。

如果您可以控制XML,則可以通過更改一個或兩個元素名稱來實現此目的。例如,人們可以使用簡單的數值VALOBJ複合的:

<xs:complexType name="composite-key"> 
    <xs:choice maxOccurs="unbounded"> 
    <xs:element name="val" type="simple-key"/> 
    <xs:element name="obj" type="composite-key"/> 
    </xs:choice> 
    <xs:attribute name="name" type="xs:string" use="required"/> 
</xs:complexType> 

調整名稱的味道。這將是我推薦的解決方案,因爲它強調清晰度。但是,元素名稱可能無法控制。如果是這樣,一個不太令人滿意的解決方案將是如下:

<xs:complexType name="key" mixed="true"> 
    <xs:sequence maxOccurs="unbounded"> 
    <xs:element name="key" type="key"/> 
    </xs:sequence> 
    <xs:attribute name="name" type="xs:string" use="required"/> 
    <xs:attribute name="type" type="xs:string"/> 
    <xs:attribute name="representation" type="xs:string"/> 
</xs:complexType> 

這裏的關鍵差異是混合內容類型,並且不幸的事實,該聲明現在是簡單和複合密鑰類型的汞齊。我認爲這是「不太令人滿意」,因爲現在您必須在Schema完成之後在您自己的代碼中執行額外的有效性檢查。例如,您需要驗證給定的屬性集是否對隱含的鍵類型有意義。此外,書面示例將允許文本出現在嵌套關鍵元素之間的任何位置 - 可能是您不想要的東西。

[編輯:同樣的問題是在計算器here討論]