XSD 1.1:限制一个元素的总属性数

XSD 1.1: Limit number of overall attributes for an element

我正在开发一款纸牌游戏,它应该显示多种状态并根据条件更改它们。为了实现这一点,我有一个元素 <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 个则为 false”。 此外,这应该不会限制在给定每张卡片本身的单个元素 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>

当使用断言将属性的元素用作子元素时,有没有办法限制属性的总数?

我不确定是不是限制类型而不是

形式的断言更好
   <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:assert test="every $prop in connected_condition/properties satisfies count($prop/@*) le 2"/>
        </xs:complexType>
    </xs:element>

可能会表达您对 connected_condition 中每个 properties 元素的属性数量的限制。

您的评论表明您更想要 <xs:assert test="count(connected_condition//@*) le 2"/>