11

第一个问题(善良!) 解释:如果一个属性是真的,我需要这个类型有元素。因此,如果某个属性为真,则 XML 输出可能是:

<Approval Approved="true">
   <By>RT</By>
   <Date>27/07/2011</Date>
</Approval>

如果未获批准,则 XML 输出可能是

<Approval Approved="false" />

是否可以在 XSD 中指定类似的内容?

4

2 回答 2

6

事实证明,你可以做到(有点),但这种方法完全糟糕透了。

必须制作两种复杂类型(一种带有 Approved 标签,另一种没有),更改根元素并允许在两种类型之间切换,如下所示:

<xs:element name="ArchivedFormulation">
 <xs:complexType>
  <xs:choice>
    <xs:element name="ApprovedFormulation" type="ApprovedFormulation" />
    <xs:element name="NonApprovedFormulation" type="NonApprovedFormulation" />
  </xs:choice>
</xs:complexType>

可以使用 XSD 继承添加复杂类型。

<xs:complexType name="ApprovedFormulation">
<xs:complexContent>
  <xs:extension base="NonApprovedFormulation">
    <xs:sequence>
      <xs:element name="Approved" minOccurs="1" maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="ApprovedBy" type="xs:string" />
            <xs:element name="ApprovedOn" type="xs:date" />
          </xs:sequence>
          <xs:attribute name="IsApproved" type="xs:boolean" />
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:extension>
</xs:complexContent>

这给了我想要的东西。

于 2011-07-28T10:22:02.760 回答
1

一个稍微简单的方法是不使用Approved值为真或假的属性来指示布尔值,而是使用Approved存在或不存在的空元素来发出信号。

<xs:element name="Formulation">
  <xs:complexType>
    <xs:sequence minOccurs="0">
      <xs:element ref="Approved"/>
      <xs:element ref="By"/>
      <xs:element ref="Date"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

现在您的两个示例如下所示:

<Formulation/>
<Formulation>
  <Approved/>
  <By>RT</By> 
  <Date>27/07/2011</Date>
</Formulation>
于 2013-01-24T09:28:20.047 回答