XSD设计 - 一个或多个规则

时间:2009-11-23 17:17:59

标签: 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实例。我不能使用choice元素,因为必须能够为XML实例提供更多的一个点类型元素。对于单个事务,不得重复相同的点类型。

是否可以在XSD的设计中强制执行此规则?

我有一份Neil Bradley出色的XML Schema Companion副本。我在那里找不到答案,所以我想这不可能,但我想我会分享这个难题!

由于

罗布。

3 个答案:

答案 0 :(得分:2)

我认为这种约束逻辑超出了XSD。以下是three techniques,用于检查实例文档中是否存在XML Schema无法表达的约束。

答案 1 :(得分: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之间“。不幸的是,“四种类型中至少有一种必须存在”也属于该类别:-(没有运气。

答案 2 :(得分: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>