XSD - дочерние элементы в зависимости от значения атрибута - PullRequest
4 голосов
/ 13 января 2009

Я пытаюсь создать схему XSD для следующего XML:

<root>
  <!-- The actual file must contain one of the following constraints -->
  <constraint type="interval">
    <min>100</min>
    <max>200</max>
  </constraint>

  <constraint type="equals">
    <value>EOF</value>
  </constraint>
</root>

Дочерние элементы элемента ограничения зависят от значения атрибута type.

Я успешно проверил XML, используя абстрактный тип, определяющий атрибут типа, и два расширяющих типа, определяющих дочерние элементы. Это потребовало бы, чтобы я украсил XML атрибутом xsi: type, назвав фактический тип расширения:

  <constraint type="interval" xsi:type="intervalConstraintType">
    <min>100</min>
    <max>200</max>
  </constraint>

К сожалению, я не контролирую XML-структуру, и новые атрибуты будет сложно ввести.

Это выполнимо с XSD? Есть ли альтернативы, которые более подходят?

Ответы [ 2 ]

0 голосов
/ 15 апреля 2014

Дочерние элементы элемента ограничения зависят от значения атрибута type.

Я думаю, что это возможно с XSD 1.1, с использованием утверждений. Ваша схема может выглядеть примерно так (не проверено)

<!-- ... -->
<xs:element name="constraint"> 
  <xs:complexType> 
     <xs:sequence> 
         <xs:element name="min" type="xs:decimal" minOccurs="0" maxOccurs="1" /> 
         <xs:element name="max" type="xs:decimal" minOccurs="0" maxOccurs="1" />
         <xs:element name="value" type="xs:string"minOccurs="0" maxOccurs="1" />
     </xs:sequence> 
     <xs:attribute name="type" type="contraintType" />

     <xs:assert test="

        if (@type eq 'equals')
        then (exist(value) and empty(min, max))
        else (exist(min) and exist(max) and empty(value))

     "/>

</xs:complexType> 
</xs:element>

<xs:simpleType name="contraintType">
    <xs:restriction base="xs:string">
        <xs:enumeration value="interval"/>
        <xs:enumeration value="equals"/>
    </xs:restriction>
</xs:simpleType>
0 голосов
/ 13 января 2009

Я думаю, что это должно быть возможно, но я в настоящее время не знаю, как сделать это самостоятельно. В качестве обходного пути вы можете переписать xml на лету, чтобы включить ваше расширение.

Редактировать: Хм, похоже, что это невозможно, по крайней мере, не в XSD 1.0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...