一系列XML元素可以以属性为条件吗?

时间:2011-07-27 12:23:55

标签: xml xsd xsd-validation

第一个问题(善良!)说明:如果属性为true,我需要具有元素的类型。因此,如果属性为true,则XML输出可能为:

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

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

<Approval Approved="false" />

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

2 个答案:

答案 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>