Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > XML, XSL > Как в XSD схеме реализовать конструкцию 'OR'?


Автор: Compositum 1.4.2012, 19:27
Доброго времени суток.
Как в XSD схеме реализовать конструкцию 'OR'?

У меня есть такое определение типа:
Код

<!--ru-RU: Группа настроек-->
  <xs:complexType name="settingsGroup" >    
    <xs:sequence>
      <xs:element name="string" type="stringValue" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="bool" type="boolValue" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="date" type="dateValue" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="dateTime" type="dateTimeValue" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="int" type="intValue" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="double" type="doubleValue" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="day" type="dayValue" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="month" type="monthValue" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="year" type="yearValue" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="localization" type="languageValue" minOccurs="0" maxOccurs="unbounded"/>     
    </xs:sequence>
    <xs:attribute name="nameId" type="xs:ID" use="required"/>
  </xs:complexType>

Но я хочу его изменить так, чтобы объект типа settingsGroup мог принимать ЛИБО то, что показано выше (произвольную коллекцию объектов обозначенных типов), ЛИБО коллекцию объектов типа settingsGroup. Т.е. должна присутствовать возможность создания дерева.

Спасибо.

Автор: LSD 2.4.2012, 12:44
Код

    <xsd:complexType name="settingsGroup">
        <xsd:sequence>
            <xsd:element name="string" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
            <xsd:element name="bool" type="xsd:boolean" minOccurs="0" maxOccurs="unbounded"/>
            <xsd:element name="nestedGroup" type="settingsGroup"/>
        </xsd:sequence>
        <xsd:attribute name="nameId" type="xsd:ID" use="required"/>
    </xsd:complexType>

Автор: Compositum 2.4.2012, 13:05
Цитата(LSD @ 2.4.2012,  12:44)
Код

    <xsd:complexType name="settingsGroup">
        <xsd:sequence>
            <xsd:element name="string" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
            <xsd:element name="bool" type="xsd:boolean" minOccurs="0" maxOccurs="unbounded"/>
            <xsd:element name="nestedGroup" type="settingsGroup"/>
        </xsd:sequence>
        <xsd:attribute name="nameId" type="xsd:ID" use="required"/>
    </xsd:complexType>

согласно такому варианту обязательно должна присутствовать подгруппа и необязательно - др. элементы. А мне нужно, чтобы были ЛИБО эти элементы, ЛИБО подгруппы, но не то и другое одновременно.

Автор: diadiavova 3.4.2012, 07:58
Цитата(Compositum @  1.4.2012,  20:27 Найти цитируемый пост)
ИБО то, что показано выше (произвольную коллекцию объектов обозначенных типов), ЛИБО коллекцию объектов типа settingsGroup

Не понял: насколько я понимаю, выше показана именно settingGroup. Вообще задать альтернативу конкретной коллекции в виде произвольной вряд ли получится, поскольку обработчику нужно четкое правило, касающееся того какой именно набор правил следует применить в данном контексте. А если эти два набора имеют достаточно четкие различия, то видимо их можно поместить в элемент choice. Но в схеме все надо пробовать smile Вот например при таком раскладе будет все нормально и у элемента root будут потомки либо a b c, либо d b c
Код

  <xs:element name="root">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="1">
        <xs:sequence>
          <xs:element name="a"/>
          <xs:element name="b"/>
          <xs:element name="c"/>
        </xs:sequence>
        <xs:sequence>
          <xs:element name="d"/>
          <xs:element name="b"/>
          <xs:element name="c"/>
        </xs:sequence>
      </xs:choice>
    </xs:complexType>
  </xs:element>
но если во второй секвенции последовательность начать с a (как в первом случае), то возникает двусмысленность в вопросе о том, какое правило использовать, причем независимо от того, что последует за этим элементом, поскольку при разборе обработчик именно по нему попытается определить какую из секвенций следует применить.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)