2011-07-27 69 views
11

第一个问题(是那种!)说明:如果一个属性的真实,我需要的类型有元素。所以,如果一个属性为true,则XML输出可能是:一系列XML元素是否可以以属性为条件?

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

而如果是不批准的,XML输出可能是

​​

是否可以指定一个像这样XSD?

+1

这不是在XSD可能的,但你也许能够表达,使用的Schematron(http://www.schematron.com/)或相似的东西。 –

回答

6

事实证明,你能做到这一点(在某种程度上),但方法完全吸收。

不得不做出两个复杂类型(一个与已批准的标签和一个没有),改变的根元素,并且允许这样的两种类型之间的切换:

<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

一个稍微简单一些的方法是将信号的布尔值与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> 
相关问题