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

Restricting XML element values based on other values in XSD

我正在 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. 要求在<dimensions>的基础上,每格有一个<cell>。例如,如果尺寸为 21x21,则必须有 441 个 <cell>-- 不多也不少。

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

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

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

您将放置在 dimensions 中的信息隐含在您的 cell 元素的结构中,并且可以 自动导出 而不是允许 任意设置然后必须独立验证

类似的论点适用于 coordinates

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