我正在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
&gt;有一个<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列。
我想做以下事情:
根据<cell>
,要求每个方格都有一个<dimensions>
。例如,如果维度为21x21,则必须有441个<cell>
个实例 - 不多也不少。
要求每个<coordinates>
的{{1}}都是唯一的,并且属于<cell>
的参数范围。换句话说,对于21x21网格,坐标的每个轴必须由1到21之间的数字表示,并且441个组合中的每一个只能使用一次。
答案 0 :(得分:1)
您需要XSD 1.1;使用断言。或者您需要参数化您的模式(并且可能稍微重新组织您的XML)以便以不同的方式强制执行约束(例如,通过让模式正好需要21行,每行只有21个单元格。)
答案 1 :(得分:1)
是的,可以使用断言,但 XML设计更改会更好......
dimensions
元素的结构暗示了cell
中的信息,可以自动派生,而不是任意设置< / em>然后必须独立验证。
类似的论点适用于coordinates
。
(另请注意,即使您确实希望明确表示坐标,最好为每个坐标使用单独的元素,或者更好的属性。)