Может ли последовательность элементов XML быть обусловлена ​​свойством?

Первый вопрос (будь добр!) Объяснение: если свойство true, мне нужен тип, чтобы иметь элементы. Поэтому, если атрибут true, выход XML может быть:

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

И если он не одобрен, выход XML может быть

<Approval Approved="false" />

Можно ли указать что-то подобное в XSD?

Ответ 1

Оказывается, вы можете это сделать (вроде), но метод полностью отстой.

Чтобы сделать два сложных типа (один с тегом 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>

Это дало мне то, что я хотел.

Ответ 2

Несколько более простой метод заключается в том, чтобы сигнализировать логическое значение не с атрибутом 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>