我正在设计一个新的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副本。我在那里找不到答案,所以我想这不可能,但我想我会分享这个难题!
由于
罗布。
答案 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>