【发布时间】:2021-07-29 07:27:11
【问题描述】:
我正在开发一款纸牌游戏,它应该显示多种状态并根据条件更改它们。为了实现这一点,我有一个元素 <properties> 作为强制性元素赋予每张卡片。每个属性都可以有一系列属性,如 xsd 示例中所示:
<xs:element name="properties" maxOccurs="1">
<xs:complexType>
<xs:attribute name="type" type="MyAttributeType"/>
<xs:attribute name="color" type="color"/>
<xs:attribute name="number" type="xs:integer"/>
</xs:complexType>
</xs:element>
这些properties 不仅显示了每张卡片的属性,还设置了整个游戏场的属性。
现在我的任务是让一张牌可以根据自己的属性改变游戏场的这些属性。为此,我应该实现一个类型connected_condition,它只在某个条件为真时触发。例如:
<connected_condition><properties color='red'/><properties color='green'/></connected_condition/>
例如,当显示具有“红色”属性的卡片时,该条件应该将游戏区域的颜色更改为绿色而不是红色。
但是 - 因为我们在这里处理属性,所以像这样的 connected_condition 可能是有效的,但会违反我必须完成的任务:
<connected_condition><properties color='red' type='heart'/><properties color='green'/></connected_condition/>
无论properties 内部是否有一个或两个元素,在connected_condition 的上下文中,最多两个属性的总数应该是有效的。但同样的属性也应该能够改变(例如红色到绿色),我没有找到一种方法在connected_condition 的一个属性元素中使用 2 倍相同的属性。为了解决这个问题,我正在寻找一种方法来限制可以在元素connected_condition 的上下文中使用的属性总数。最好是一个断言帽说类似:“计算connected_condition内所有子元素的所有属性,如果超过2个则为假”。
此外,这应该不会限制单个元素 properties 中使用的属性数量,该元素提供给每张卡本身。最好的结果是这样的卡片:
XSD:
<xs:element name="card">
<xs:complexType>
<xs:sequence>
<xs:element name='name' type='xs:string'/>
<xs:element name="properties" type='properties'/> <!--should have all 3 of its attributes-->
<xs:element name='connected_condition' minOccurs='0' maxOccurs='1'>
<xs:complexType>
<xs:sequence>
<xs:element name="properties" type='properties' maxOccurs='2'/> <!--attributes limited to 2-->
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:simpleType name='properties'>
<xs:restriction base="xs:string">
<xs:attribute name="type" type="MyAttributeType"/>
<xs:attribute name="color" type="color"/>
<xs:attribute name="number" type="xs:integer"/>
</xs:restriction>
</xs:simpleType>
XML:
<card>
<name>Card 1</name>
<properties type='heart' color='red' number='7'/>
<connected_condition><properties color='red'/><properties color='green'/></connected_condition>
<text>Here goes the text</text>
</card>
当他们的元素被用作使用断言的子元素时,有没有办法限制属性的总数?
【问题讨论】:
标签: xml xsd annotations attributes assert