Может ли последовательность элементов XML быть условной для свойства? - PullRequest
11 голосов
/ 27 июля 2011

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

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

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

<Approval Approved="false" />

Можно ли указать что-токак это в XSD?

Ответы [ 2 ]

6 голосов
/ 28 июля 2011

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

Пришлось создать два сложных типа (один с тегом 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 голос
/ 24 января 2013

Немного более простым способом было бы сообщить булево значение не с атрибутом 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>
...