2009-11-23 37 views
2

我正在設計一個新的XSD以捕捉來自業務夥伴的點信息。對於每筆交易,合作伙伴必須提供至少一種積分類型的積分值。我有以下幾點:XSD設計 - 一個或多個規則

<xs:element name="Points"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="SKUPointsQty" type="xs:int" minOccurs="0"/> 
     <xs:element name="WelcomePointsQty" type="xs:int" minOccurs="0"/> 
     <xs:element name="ManualPointsQty" type="xs:int" minOccurs="0"/> 
     <xs:element name="GreenPointQty" type="xs:int" minOccurs="0"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

的業務規則:

  • 事務必須由一個或多個點類型的提供點
  • 交易不能提供相同的多個實例點類型

我到目前爲止是不理想的,因爲它可能會提供一個沒有任何點的XML實例。我不能使用選擇元素,因爲它必須可以爲一個XML實例提供更多的一個點類型元素。一次交易不得重複相同的積分類型。

是否可以在XSD的設計中強制執行此規則?

我有Neil Bradley出色的XML Schema Companion的副本。我無法在那裏找到答案,所以我想這不可能,但認爲我會分享這個難題!

謝謝

Rob。

回答

2

我覺得這種約束邏輯超出了XSD。以下是three techniques,用於檢查實例文檔中是否有XML Schemas無法表示的約束。

1
* a transaction cannot provide more than one instance of the same 

分型

做法很簡單 - 你已經有一個,基本上是這樣。

這樣以來

<xs:element name="ManualPointsQty" type="xs:int" minOccurs="0"/> 

你的「內部」元素定義他們,你讓他們選購(minOccurs="0"),默認情況下,因爲你沒有指定任何東西,他們也有一個maxOccurs="1"設置。

因此,應該照顧一半的要求。

  • 事務必須由一個或多個點的 類型

這就是XML模式並沒有幫助你多少部分提供點 - 你不能表達XSD這樣的要求。 XSD只適用於「結構化」建模 - 諸如「包括這個」,「包括這些中的1到5個」 - 但是你不能表達「跨越」多於一個元素的限制,例如「如果A存在,那麼B不能存在「,或者」如果存在A,那麼B的值必須在10和100之間「。 「至少有四種類型中的一種必須存在」也屬於這一類,不幸的是---(那裏沒有運氣。

0

由於它的一個序列,你可以選擇四種形式,這取決於第一個元素的存在嗎?

<xs:element name="Points"> 
    <xs:complexType> 
     <xs:choice> 
      <xs:sequence> 
       <xs:element name="a" type="xs:int" /> 
       <xs:element name="b" type="xs:int" minOccurs="0"/> 
       <xs:element name="c" type="xs:int" minOccurs="0"/> 
       <xs:element name="d" type="xs:int" minOccurs="0"/> 
      </xs:sequence> 
      <xs:sequence> 
       <xs:element name="b" type="xs:int" /> 
       <xs:element name="c" type="xs:int" minOccurs="0"/> 
       <xs:element name="d" type="xs:int" minOccurs="0"/> 
      </xs:sequence> 
      <xs:sequence> 
       <xs:element name="c" type="xs:int" /> 
       <xs:element name="d" type="xs:int" minOccurs="0"/> 
      </xs:sequence> 
      <xs:sequence> 
       <xs:element name="d" type="xs:int" /> 
      </xs:sequence> 
     </xs:choice> 
    </xs:complexType> 
</xs:element>