2016-06-03 26 views
1

Ich möchte eine XSD definieren, die ein Element bestimmte Kinder in Bezug auf einen seiner Attributwert haben kann. Diese Attributwerte werden mit mehreren xsd:enumeration definiert.XSD Restriction Tag Inhalt in Abhängigkeit von Attributwert

Hier ist, wie mein XML sein kann:

<root> 
    <Conversion type="Phys" /> 
    <Conversion type="Fact"> 
     <Factor>13</Factor> 
     <Offset>37</Offset> 
    </Conversion> 
    <Conversion type="List"> 
     <Item> 
      <Key>0</Key> 
      <Value>KEY_0</Value> 
     </Item> 
     <Item> 
      <Key>1</Key> 
      <Value>KEY_1</Value> 
     </Item> 
    </Conversion> 
</root> 

Bisher habe ich es geschafft, die Conversion Tag zu beschränken nur diese drei Attribute haben und nur diese drei Sequenzen als Kinder (Factor/Offset; Item Liste ; nichts). Hier

ist ein bisschen meine XSD:

<xs:element name="Conversion"> 
    <xs:complexType> 
     <xs:choice> 
      <xs:sequence> 
       <xs:element name="Item" maxOccurs="unbounded"> 
        <xs:complexType> 
         <xs:sequence> 
          <xs:element name="Key" type="xs:decimal" /> 
          <xs:element name="Value" type="xs:string" /> 
         </xs:sequence> 
        </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
      <xs:sequence> 
       <xs:element name="Factor" type="xs:double" /> 
       <xs:element name="Offset" type="xs:double" /> 
      </xs:sequence> 
      <xs:sequence /> 
     </xs:choice> 
     <xs:attribute name="Type"> 
      <xs:simpleType> 
       <xs:restriction base="xs:string"> 
        <xs:enumeration value="Fact" /> 
        <xs:enumeration value="List" /> 
        <xs:enumeration value="Phys" /> 
       </xs:restriction> 
      </xs:simpleType> 
     </xs:attribute> 
    </xs:complexType> 
</xs:element> 

Was würde ich tun, um die Kinder zu beschränken entsprechend dem Wert meines Attribut zu vermeiden Mischen Attribute und Inhalte zu verbieten.

Antwort

2

Sie benötigen XSD 1.1, um genau das zu tun, was Sie anfordern, und machen ein Inhaltsmodell abhängig vom Wert eines Attributs. Sie können die bedingte Typzuweisung oder sogar Assertionen verwenden.

Wenn Sie jedoch Ihr XML-Design anpassen können, können Sie grundlegende XSD 1.0 (und XSD 1.1 als auch) verwenden:

<root> 
    <Phys/> 
    <Fact> 
     <Factor>13</Factor> 
     <Offset>37</Offset> 
    </Fact> 
    <List> 
     <Item> 
      <Key>0</Key> 
      <Value>KEY_0</Value> 
     </Item> 
     <Item> 
      <Key>1</Key> 
      <Value>KEY_1</Value> 
     </Item> 
    </List> 
</root> 

Typ Informationen werden in der Regel über einen spezifischeres Elementnamen vermitteln besser als über Erweiterung eines generischen Elementnamens mit einem type-Attribut.

+0

Danke für die schnelle Antwort! Ich verstehe was du meinst. Tatsächlich ist das 'Conversion'-Tag Teil eines 'Variable'-Typs mit anderen Geschwistern. Es beschreibt also die "Art der Konvertierung" ihrer Variablen. Ich werde es mit XSD 1.1 versuchen – PlikPlok