根据XSD中的其他值限制XML元素值

时间:2016-05-11 15:21:30

标签: xml xsd xsd-1.1

我正在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列。

我想做以下事情:

  1. 根据<cell>,要求每个方格都有一个<dimensions>。例如,如果维度为21x21,则必须有441个<cell>个实例 - 不多也不少。

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

dimensions元素的结构暗示了cell中的信息,可以自动派生,而不是任意设置< / em>然后必须独立验证。

类似的论点适用于coordinates

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