2009-11-23 92 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>