如何使两个可选标签中的一个依赖于另一个?

时间:2015-07-21 19:20:58

标签: xml xsd

我在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">

1 个答案:

答案 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断言

如果您的处理器使用的是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一起使用的解决方案。