如何为XSD架构中的2种元素类型强制至少出现一次

如何为XSD架构中的2种元素类型强制至少出现一次,xsd,Xsd,我需要为这个场景开发一个xsd。其中我有两个类型为Server1和Server2的元素。Server1和Server2可以出现任意数量的事件,但至少有一个事件是必需的,即Server1或Server2 <element name="Server1"> <complexType> <sequence> <element name="hostName" type="string"/> <element name="por

我需要为这个场景开发一个xsd。其中我有两个类型为Server1和Server2的元素。Server1和Server2可以出现任意数量的事件,但至少有一个事件是必需的,即Server1或Server2

<element name="Server1">
  <complexType>
   <sequence>
    <element name="hostName" type="string"/>
    <element name="portNumber" type="integer"/>
    <element name="userName" type="string"/>
   </sequence>
  </complexType>
</element>
<element name="Server2">
  <complexType>
   <sequence>
    <element name="hostName" type="string"/>
    <element name="portNumber" type="integer"/>
   </sequence>
  </complexType>
</element>

谢谢 Ravi

您可以将它们包装到模式元素中,并将maxOccurs属性设置为unbounded

样本:

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <element name="root">
        <complexType>
            <choice maxOccurs="unbounded">
                <element name="Server1">
                    <complexType>
                        <sequence>
                            <element name="hostName" type="string"/>
                            <element name="portNumber" type="integer"/>
                            <element name="userName" type="string"/>
                        </sequence>
                    </complexType>
                </element>
                <element name="Server2">
                    <complexType>
                        <sequence>
                            <element name="hostName" type="string"/>
                            <element name="portNumber" type="integer"/>
                        </sequence>
                    </complexType>
                </element>
            </choice>
        </complexType>
    </element>
</schema>

我不确定这是否是最好的选择,但有一种可能是将
Server1
Server2
仅仅作为类型名称,然后创建一个元素,它是
Server1
Server2
的联合体

<xsd:comlexType name=Server1>
   <sequence>
   // ...
   </sequence>
</xsd:complextype>

<xsd:complexType name=Server2>
// ...
</xsd:complexType>

<element name="Server">
   <xsd:union memberTypes = "Server1 Server2" />
</element>

// ...
// ...

使用引用可能比使用嵌套元素更好(从长远来看,这会使维护更容易),但这绝对是正确的方法