根据 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列。
我想执行以下操作:
要求在<dimensions>
的基础上,每格有一个<cell>
。例如,如果尺寸为 21x21,则必须有 441 个 <cell>
-- 不多也不少。
要求每个 <cell>
的 <coordinates>
是唯一的并且在 <dimensions
的参数范围内。也就是说,对于一个21x21的格子,坐标的每个轴都必须用1到21之间的数字来表示,441种组合中的每一种都只能使用一次。
您将需要 XSD 1.1;使用断言。或者您将需要参数化您的模式(并且可能重新组织您的 XML 一点)以不同的方式强制执行约束(例如,通过让模式正好需要 21 行,每行恰好有 21 个单元格)。
是的,可以使用断言,但是 XML 设计更改会更好...
您将放置在 dimensions
中的信息隐含在您的 cell
元素的结构中,并且可以 自动导出 而不是允许 任意设置然后必须独立验证
类似的论点适用于 coordinates
。
(另请注意,即使您确实希望明确表示坐标,最好为每个坐标使用单独的元素,或者更好的是属性。)
我正在 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列。
我想执行以下操作:
要求在
<dimensions>
的基础上,每格有一个<cell>
。例如,如果尺寸为 21x21,则必须有 441 个<cell>
-- 不多也不少。要求每个
<cell>
的<coordinates>
是唯一的并且在<dimensions
的参数范围内。也就是说,对于一个21x21的格子,坐标的每个轴都必须用1到21之间的数字来表示,441种组合中的每一种都只能使用一次。
您将需要 XSD 1.1;使用断言。或者您将需要参数化您的模式(并且可能重新组织您的 XML 一点)以不同的方式强制执行约束(例如,通过让模式正好需要 21 行,每行恰好有 21 个单元格)。
是的,可以使用断言,但是 XML 设计更改会更好...
您将放置在 dimensions
中的信息隐含在您的 cell
元素的结构中,并且可以 自动导出 而不是允许 任意设置然后必须独立验证
类似的论点适用于 coordinates
。
(另请注意,即使您确实希望明确表示坐标,最好为每个坐标使用单独的元素,或者更好的是属性。)