第一个问题(是那种!)说明:如果一个属性的真实,我需要的类型有元素。所以,如果一个属性为true,则XML输出可能是:一系列XML元素是否可以以属性为条件?
<Approval Approved="true">
<By>RT</By>
<Date>27/07/2011</Date>
</Approval>
而如果是不批准的,XML输出可能是
是否可以指定一个像这样XSD?
第一个问题(是那种!)说明:如果一个属性的真实,我需要的类型有元素。所以,如果一个属性为true,则XML输出可能是:一系列XML元素是否可以以属性为条件?
<Approval Approved="true">
<By>RT</By>
<Date>27/07/2011</Date>
</Approval>
而如果是不批准的,XML输出可能是
是否可以指定一个像这样XSD?
事实证明,你能做到这一点(在某种程度上),但方法完全吸收。
不得不做出两个复杂类型(一个与已批准的标签和一个没有),改变的根元素,并且允许这样的两种类型之间的切换:
<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>
这不是在XSD可能的,但你也许能够表达,使用的Schematron(http://www.schematron.com/)或相似的东西。 –