2

我正在 XSD 1.1 中为填字游戏创建一个模式。我的元素之一是<dimensions>. 例子:

<xs:element name="dimensions">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:pattern value="\d+x\d+"/>
      </xs:restriction>
    </xs:simpleType>
 </xs:element>

生成的 XML 看起来像<dimensions>21x21</dimensions>,这意味着拼图网格是 21 平方乘 21 平方。

我还<cell>为拼图中的每个方格设置了一个元素。因此,对于尺寸为 21x21 的拼图,我将有 441 个<cell>. 每个<cell> 都有一个<coordinates>元素描述它在网格中的位置:

<xs:element name="cell">  
    <xs:complexType>  
        <xs:sequence>
            <xs:element name="coordinates">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:pattern value="\d+,\d+"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>

所以格子左下角的方格位置用 表示<coordinates>21,1</coordinates>,表示它在第 21 行第 1 列。

我想做以下事情:

  1. 要求<cell>每个方格都有一个,基于<dimensions>. 例如,如果尺寸是 21x21,则必须有 441 个实例<cell>--no more, not less。

  2. 要求<coordinates>for each<cell>是唯一的,并且在 的参数范围内<dimensions。换句话说,对于一个 21x21 的网格,坐标的每个轴必须用 1 到 21 之间的数字表示,并且 441 种组合中的每一种只能使用一次。

4

2 回答 2

1

是的,可以使用断言,但XML 设计更改会更好......

您要放入的信息dimensions由元素的结构暗示,cell可以自动派生,而不是允许任意设置,然后必须独立验证。

类似的论点适用于coordinates

(还要注意,即使您确实希望明确表示坐标,最好为每个坐标使用单独的元素,或者更好的是属性。)

于 2016-05-11T16:51:17.390 回答
1

您将需要 XSD 1.1;使用断言。或者您将需要参数化您的架构(并且可能重新组织您的 XML)以不同的方式强制执行约束(例如,通过让架构需要正好 21 行,每行正好有 21 个单元格)。

于 2016-05-11T15:33:14.067 回答