2016-12-01 2 views
1

У меня есть следующая схема.XML Schema задает значение атрибута определенного типа

<xs:attribute name="level"> 
<xs:simpleType> 
    <xs:restriction base="xs:integer"> 
     <xs:pattern value="[0-3]"/> 
    </xs:restriction> 
</xs:simpleType> 

<xs:complexType name="var">   
    <xs:attribute ref="level" use="required"/> 
    <xs:attribute ref="name" use="required"/> 
</xs:complexType> 

<xs:attribute name="name" type="xs:string"/> 

Теперь я хотел бы создать элемент "пару", который содержит два "вар". У этих варов атрибут «уровень» установлен в 0.

<xs:element name="pair"> 
    <xs:complexType> 
    <xs:sequence>  
     <!-- --!> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

Я сделал несколько попыток, но безуспешно. Любая помощь ?

+0

Возможно, будет яснее, если вы покажете нам XML, который вы хотите описать в своей схеме. Ваши фрагменты схемы не имеют смысла, и ваше описание того, что вы пытаетесь достичь, очень запутанно. –

ответ

0

Во-первых, я бы не использовал объявления глобальных атрибутов, потому что они вызывают проблемы при добавлении пространств имен к Схеме.

Если вы хотите, чтобы объявить сложный тип элемента «вар» глобально (так как он используется в нескольких местах), то вы можете ограничить тип локально и установите атрибут «уровень» на фиксированное значение. Обратите внимание, что атрибуты наследуются ограничения типа, так что вам нужно только список атрибутов, которые вы хотите ограничить:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:simpleType name="LevelType"> 
    <xs:restriction base="xs:integer"> 
     <xs:pattern value="[0-3]"/> 
    </xs:restriction> 
    </xs:simpleType> 

    <xs:complexType name="VarType"> 
    <xs:attribute name="level" type="LevelType" use="required"/> 
    <xs:attribute name="name" type="xs:string" use="required"/> 
    </xs:complexType> 

    <xs:element name="pair"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="var" minOccurs="2" maxOccurs="2"> 
      <xs:complexType> 
      <xs:complexContent> 
       <xs:restriction base="VarType"> 
       <xs:attribute name="level" type="LevelType" use="required" fixed="0"/> 
       </xs:restriction> 
      </xs:complexContent> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

</xs:schema> 

В качестве более простой альтернативы, вы можете просто объявить атрибуты локально, где это необходимо, например, так:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:simpleType name="LevelType"> 
    <xs:restriction base="xs:integer"> 
     <xs:pattern value="[0-3]"/> 
    </xs:restriction> 
    </xs:simpleType> 

    <xs:element name="pair"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="var" minOccurs="2" maxOccurs="2"> 
      <xs:complexType> 
      <xs:attribute name="level" type="LevelType" use="required" fixed="0"/> 
      <xs:attribute name="name" type="xs:string" use="required"/> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

</xs:schema> 
+0

Я решил определить complexType «var» и complexType «var_i» для i = 0, ... 3. Спасибо ! – Discipulos

Смежные вопросы