1

我正在写一些 XSD,我对<choice>标签只有一个基本的了解。我让它与一个部分一起工作,但不是另一个具有attribute.

例如,所有元素都是可选的,但如果我没有一个,那么我需要另一个。如果有 2 个元素,这很好,但我有 3 个。

查看下面的架构部分。我可以有messagescan没有include,或者我可以有include但没有messagescan

       <xs:element name="messages">
        <xs:complexType>
          <xs:sequence>
            <xs:element minOccurs="0" ref="n:properties"/>

        <xs:choice>
          <xs:sequence>
            <xs:element ref="n:message" maxOccurs="unbounded"/>
            <xs:element ref="n:scan" minOccurs="0"/>
          </xs:sequence>

          <xs:element ref="n:scan"/>
        </xs:choice>

              <xs:attribute name="include"/>
          </xs:sequence>
        </xs:complexType>

  </xs:element>

目前,这是可行的messagescan但显然给了我一个错误include,因为我还没有选择。

谁能给我看一些我会怎么做的样本(message OR scan) OR include

谢谢

4

1 回答 1

1

到目前为止,说“A 或 B 或 C”的最简单方法是让 A、B 和 C 都成为元素并编写

<xs:choice>
  <xs:element ref="A"/>
  <xs:element ref="B"/>
  <xs:element ref="C"/>
</xs:choice>

另一种方法是说“包含来自另一个文件的消息与指定消息不同”并定义两者n:messages(包含 amessage或 a scan)和n:message-inclusion(指向另一个文件)。在父元素中允许任一。或者定义一个抽象message-thingy元素并将n:messagesandn:message-inclusion放入它的替换组中。

第二种选择:转移到 XSD 1.1 并使用断言来强制执行规则,即include当子级不存在时属性存在。

于 2012-08-21T17:35:47.163 回答