我在XSD中有两个标签:
<xsd:element name="tag1" minOccurs="0">
<xsd:element name="tag2" minOccurs="0">
它们都是可选的,可以省略。但是我想添加一个限制,如果给出tag2,还应该给出tag1(因为tag2依赖于tag1)。如何通过XSD实现这一目标?
编辑:
它们之间有强制标签。因此序列将不起作用。 e.g。
<xsd:element name="tag1" minOccurs="0">
<xsd:element name="tag3" minOccurs="1">
<xsd:element name="tag4" minOccurs="1">
<xsd:element name="tag2" minOccurs="0">
答案 0 :(得分:2)
以下是一些解决方案:
这是一个很长的解决方案,因为它会重复部分模型,但如果您确实需要可选标记和标记之间的强制标记不在xs:all
内,则它可以正常工作:
<xsd:choice>
<!-- Choice option 1: optional tags present -->
<xsd:sequence>
<xsd:element name="optionalTag1"/>
<xsd:element name="complulsoryTag1"/>
<xsd:element name="complulsoryTag2"/>
<xsd:element name="optionalTag2"/>
</xsd:sequence>
<!-- Choice option 2: optional tags not present -->
<xsd:sequence>
<xsd:element name="complulsoryTag1"/>
<xsd:element name="complulsoryTag2"/>
</xsd:sequence>
</xsd:choice>
请注意,如果您使用xs:group
对可疑中心标记进行分组,则可以避免在模型上重复标记。
如果它们之间没有强制标记,您只需将它们包含在minOccurs=0
的序列中即可。因此,如果序列出现,则两个标签都存在,如果序列没有出现,则不存在任何标签:
<xsd:sequence minOccurs="0">
<xsd:element name="tag1"/>
<xsd:element name="tag2"/>
</xsd:sequence>
请注意,这不会在xs:all
内工作,但如果您愿意,可以在选项内使用,甚至可以在其他序列内使用。
如果您的处理器使用的是XSD 1.1,您可以使用xs:assert来确保所有可选标记都存在或者没有任何标记存在:
<xsd:complexType>
<xsd:sequence>
<xsd:element name="optionalTag1" minOccurs="0"/>
<xsd:element name="complulsoryTag1"/>
<xsd:element name="complulsoryTag2"/>
<xsd:element name="optionalTag2" minOccurs="0"/>
</xsd:sequence>
<!-- Both optional tags are present or none of them are present -->
<xsd:assert test="boolean(optionalTag1) = boolean(optionalTag2)"/>
</xsd:complexType>
请注意,这是所提出的解决方案中唯一可与xs:all
一起使用的解决方案。