我正在寻找一种解决方案,在XML 1.0的约束条件下,在XSD模式中指定一个表应该被完全填满或完全不填满。这个表是可选的,只有在适用的情况下才需要填充,但如果适用,表中的所有元素都是强制性的。我试过用以下方式指定表格 minOccurrences = "0"
和表中的元素与 minOccurrences = "1"
但我总是要为这些元素提供一个值。
该表是可选的
所以, minOccurs="0"
的表元素上。
并且只需要在适用的时候填写
一些适用性约束在XSD 1.0中是不可表达的。
如果您可以升级到XSD 1.1,您可以使用断言来指定表单元格可以或不可以为空的标准。
但如果适用的话,表中的所有元素都是强制性的。
如果唯一的适用性约束是表单元格必须有内容,你可以通过简单的 minOccurs="0"
摆在桌上 minOccurs="1"
上的单元格。 所以,如果表在那里,单元格必须在那里。 你也可以要求单元格是非空的。 所有这些都可以在XSD 1.0中完成。
更复杂的适用性约束可能需要XSD 1.1的断言。
请看 本回答 关于如何使用 xs:assert
来指定条件,通过 every...satisfies
表单元格上必须为真。
你也可以对属性和元素设置限制。
属性限制的例子--
<xsd:element name="remove">
<xsd:complexType>
<xsd:attribute name="ref" use="optional"/>
<xsd:attribute name="uri" use="optional"/>
<xsd:assert test="(@ref and not(@uri)) or (not(@ref) and @uri)"/>
</xsd:complexType>
元素限制的例子 -
<xs:complexType name="IfBlockType">
<xs:sequence>
<xs:element type="IfType" name="If"/>
<xs:choice maxOccurs="unbounded" minOccurs="0">
<xs:element type="ElseIfType" name="ElseIf"/>
</xs:choice>
<xs:choice maxOccurs="1" minOccurs="0">
<xs:element type="ElseType" name="Else"/>
</xs:choice>
</xs:sequence>