XSD设计-一个或多个规则

XSD设计-一个或多个规则,xsd,Xsd,我正在设计一个新的XSD来从业务合作伙伴那里捕获点信息。对于每笔交易,合作伙伴必须提供至少一种积分类型的积分值。我有以下资料: <xs:element name="Points"> <xs:complexType> <xs:sequence> <xs:element name="SKUPointsQty" type="xs:int" minOccurs="0"/> <xs:element

我正在设计一个新的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实例提供多个points类型元素。同一点类型不得在单个交易中重复

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

我有一本Neil Bradley的优秀XML模式伴侣。我在那里找不到答案,所以我想这是不可能的,但我想我会分享这个谜题

谢谢


Rob.

我认为这种约束逻辑超出了XSD。下面是用于检查实例文档中XML模式无法表达的约束的示例

点类型

这相当容易——基本上你已经做到了

因为你的“内在”元素像

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

如果按原样定义,则将其设置为可选(
minOccurs=“0”
),默认情况下,由于没有指定任何其他内容,因此它们也具有
maxOccurs=“1”
设置

因此,一半的需求应该得到满足

  • 交易必须从一个或多个点中提供点 类型

这正是XML模式对您帮助不大的地方——您无法在XSD中表达这样的需求。XSD只适用于“结构”建模,如“包括此项”、“包括其中的1到5项”,但不能表示“跨越”多个元素的限制,如“如果存在A,则B不存在”或“如果存在A,则B的值必须介于10和100之间”。“四种类型中至少有一种必须存在”也属于这一类,不幸的是:-(这里运气不好。

因为它是一个序列,根据存在的第一个元素,您可以选择四种形式吗

<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>

<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>