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