第一个问题(善良!) 解释:如果一个属性是真的,我需要这个类型有元素。因此,如果某个属性为真,则 XML 输出可能是:
<Approval Approved="true">
<By>RT</By>
<Date>27/07/2011</Date>
</Approval>
如果未获批准,则 XML 输出可能是
<Approval Approved="false" />
是否可以在 XSD 中指定类似的内容?
第一个问题(善良!) 解释:如果一个属性是真的,我需要这个类型有元素。因此,如果某个属性为真,则 XML 输出可能是:
<Approval Approved="true">
<By>RT</By>
<Date>27/07/2011</Date>
</Approval>
如果未获批准,则 XML 输出可能是
<Approval Approved="false" />
是否可以在 XSD 中指定类似的内容?
事实证明,你可以做到(有点),但这种方法完全糟糕透了。
必须制作两种复杂类型(一种带有 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>
这给了我想要的东西。
一个稍微简单的方法是不使用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>