XSD последовательность выбора - PullRequest
5 голосов
/ 16 сентября 2011

Я хочу написать схему, которая принимает XML-документы, например:

<plugin>
  <label text="blabla" />
  <line />
  <break />
  <textbox name="mytextbox" length="8" required="true" />
  <checkbox name="mycheckbox" checked="true" />
  <combobox name="mycombo">
    <option value="one">Option One</option>
    <option value="two" selected="true">Option One</option>
  </combobox>
  <break />
</plugin>

Поэтому я хочу, чтобы плагин содержал элементы множества {combobox, checkbox, textbox, label, line, break}. Я написал этот XSD, но это неправильно:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
  <xs:element name="plugin">
    <xs:complexType>
      <xs:sequence>
       <xs:choice>
        <xs:element name="line" />
        <xs:element name="break" />
        <xs:element name="label">
          <xs:complexType>
            <xs:attribute name="text" type="xs:string" />
            <xs:attribute name="bold" type="xs:boolean" />
            <xs:attribute name="width" type="xs:positiveInteger" />
          </xs:complexType>
        </xs:element>
        <xs:element name="textbox">
          <xs:complexType>
            <xs:attribute name="name" type="xs:string" />
            <xs:attribute name="width" type="xs:positiveInteger" />
            <xs:attribute name="text" type="xs:string" />
            <xs:attribute name="length" type="xs:positiveInteger" />
            <xs:attribute name="required" type="xs:boolean" />
          </xs:complexType>
        </xs:element>
        <xs:element name="combobox">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="option" nillable="true" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:simpleContent msdata:ColumnName="option_Text" msdata:Ordinal="2">
                    <xs:extension base="xs:string">
                      <xs:attribute name="value" type="xs:string" />
                      <xs:attribute name="selected" type="xs:boolean" />
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
            <xs:attribute name="name" type="xs:string" />
            <xs:attribute name="width" type="xs:positiveInteger" />
          </xs:complexType>
        </xs:element>
        <xs:element name="checkbox">
          <xs:complexType>
            <xs:attribute name="name" type="xs:string" />
            <xs:attribute name="checked" type="xs:boolean" />
            <xs:attribute name="text" type="xs:string" />
            <xs:attribute name="width" type="xs:positiveInteger" />
          </xs:complexType>
        </xs:element>
       </xs:choice>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="plugin" />
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>

Я протестировал его с помощью этого инструмента проверки ...

но там написано:

"cvc-complex-type.2.4.d: найдено недопустимое содержимое, начиная с элемент 'линия'. На этом этапе не ожидается дочерний элемент. "

Итак ... Что не так? Я не понимаю это сообщение. Какие дочерние элементы в какой момент?

Ответы [ 2 ]

4 голосов
/ 16 сентября 2011

Ваше определение sequence имеет только один дочерний элемент, то есть choice.

Это означает, что plugin разрешен только один дочерний элемент, хотя это может быть любой из определенных вами элементов.

Если вы удалите элемент choice, оставив его содержимое на месте, у вас будет фиксированная последовательность элементов, которые могут быть потомками plugin.

Если вместо этого вы удалите элементэлемент sequence, оставляя его содержимое на месте, и добавляют атрибут к элементу choice: maxOccurs="unbounded", тогда он должен проверять элемент plugin с любым количеством дочерних элементов, которые вы укажете, в любомзаказ.

0 голосов
/ 20 мая 2019

Это позволит вам повторять выбор снова и снова в вашей последовательности:

<xs:complexType>
  <xs:sequence>
   <xs:choice maxOccurs="unbounded">
...