第一个问题(善良!)说明:如果属性为true,我需要具有元素的类型。因此,如果属性为true,则XML输出可能为:
<Approval Approved="true">
<By>RT</By>
<Date>27/07/2011</Date>
</Approval>
如果未获批准,则XML输出可能
<Approval Approved="false" />
是否可以在XSD中指定类似的内容?
答案 0 :(得分: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>
这给了我想要的东西。
答案 1 :(得分:1)
稍微简单的方法是用布尔值来表示不是Approved
属性,其值为true或false,但是有一个空的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>