我正在尝试定义一个具有可选标记sort_expression
的XML模式。如果提供了该可选标记,则允许使用第二个可选标记alternate_sort_expression
,但它取决于是否存在第一个标记。
例如,我希望这些示例验证:
<indication>
<label>A label for the item</label>
<sort_expression>Some Value</sort_expression>
<!-- one sort expression was provided -->
</indication>
或
<indication>
<label>A label for the item</label>
<!-- no sort expression was provided -->
</indication>
或
<indication>
<label>A label for the item</label>
<sort_expression>Some Value</sort_expression>
<alternate_sort_expression>Some Value</alternate_sort_expression>
</indication>
但以下内容不应通过验证:
<indication>
<label>A label for the item</label>
<!-- no main sort expression was provided -->
<alternate_sort_expression>INVALID</alternate_sort_expression>
</indication>
我认为以下模式,使用两个序列的选择将起作用。不幸的是,架构本身没有验证; Altova XML Spy告诉我“复杂类型指示的内容模型含糊不清:
<xs:complexType name="indication">
<xs:sequence>
<xs:element name="label" type="xs:string"/>
<xs:choice>
<xs:sequence>
<xs:element name="sort_expression" type="xs:string" minOccurs="0"/>
</xs:sequence>
<xs:sequence>
<xs:element name="sort_expression" type="xs:string"/>
<xs:element name="alternate_sort_expression" type="xs:string" maxOccurs="unbounded"/>
</xs:sequence>
</xs:choice>
</xs:sequence>
答案 0 :(得分:4)
创建一个包含必需<sort_expression>
元素和可选<alternate_sort_expression>
元素的可选序列。
由于序列相同,<alternate_sort_expression>
仅在<sort_expression>
出现时出现,但<sort_expression>
也可省略,因为整个序列可以省略。
<xs:complexType name="indication">
<xs:sequence>
<xs:element name="label" type="xs:string"/>
<xs:sequence minOccurs="0">
<xs:element name="sort_expression" type="xs:string"/>
<xs:element name="alternate_sort_expression" minOccurs="0" maxOccurs="unbounded" type="xs:string"/>
</xs:sequence>
</xs:sequence>
</xs:complexType>
答案 1 :(得分:1)
这可以使用嵌套序列:
<xs:complexType>
<xs:sequence>
<xs:element name="label" type="xs:string" />
<xs:sequence minOccurs="0" maxOccurs="1">
<xs:element name="sort_expression" type="xs:string" />
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name="alternate_sort_expression" type="xs:string" />
</xs:sequence>
</xs:sequence>
</xs:sequence>
</xs:complexType>
...至少可以根据需要验证您的示例。