开发者

Can a sequence of XML elements be conditional on a property?

First question (be kind!) Explanation: if a property's true, I need the type to have elements. So if an attribute is true, the XML output might be:

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

And if it isn't approved, the XML output 开发者_JAVA百科might be

<Approval Approved="false" />

Is it possible to specify something like this in an XSD?


Turns out, you can do it (sort of) but the method totally sucks.

Had to make two complex types (one with the Approved tag and one without), change the root element and allow switching between the two types like this:

<xs:element name="ArchivedFormulation">
 <xs:complexType>
  <xs:choice>
    <xs:element name="ApprovedFormulation" type="ApprovedFormulation" />
    <xs:element name="NonApprovedFormulation" type="NonApprovedFormulation" />
  </xs:choice>
</xs:complexType>

Could add the complex types using XSD inheritance.

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

That gave me what I wanted.


A slightly simpler method would be to signal the Boolean value not with an Approved attribute whose value is either true or false, but with an empty Approved element which is either present or absent.

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

Now your two examples look like this:

<Formulation/>
<Formulation>
  <Approved/>
  <By>RT</By> 
  <Date>27/07/2011</Date>
</Formulation>
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜