XSD - элементы в любом порядке и количестве (XML проверен XERCES с использованием XSD) - PullRequest
3 голосов
/ 23 февраля 2011

У меня проблема со схемой XML.Мне нужны внутри одного элемента элементы трех типов, но без каких-либо других ограничений, за которыми следует ровно одно вхождение элемента output:

<command path="app.exe" workingDir="/usr/local/bin">
    <param name="--name" assign="=">anyName</param>
    <switch name="--verbose"/>
    <param name="--config">/etc/app/conf.txt</param>
    <param name="--overriding">~/app/conf.txt</param>
    <switch name="-d"/>
    <param name="--report" assign="=">~/app/report.txt</param>
    <param name="--template">~/app/templates/default.tt</param>
    <string>../t/${testName}/log.txt</string>
    <output>
        <out path="stdout.txt"/>
        <err path="stderr.txt"/>
    </output>
</command>

Я могу использовать только sequence, all или choice, но никто из них не удовлетворяет моему требованию.Последовательность - любое количество раз в точном порядке.Все - ноль или один раз в любом порядке.Выбор - только один из них.Я нашел одно решение в этой сети , но оно не работает с Xerces.Я пытаюсь это сделать:

<xs:complexType name="commandType">
    <xs:sequence>
        <xs:group ref="gupa"/>
        <xs:element name="output" type="outputType" minOccurs="1" maxOccurs="1"/>
    </xs:sequence>
    <xs:attribute name="path" use="required" type="value"/>
    <xs:attribute name="workingDir" use="required" type="value"/>
</xs:complexType>

<xs:group name="gupa">
    <xs:choice>
        <xs:element name="env" type="pair" minOccurs="0" maxOccurs="unbounded"/>
        <xs:element name="param" type="paramType" minOccurs="0" maxOccurs="unbounded"/>
        <xs:element name="switch" type="switchType" minOccurs="0" maxOccurs="unbounded"/>
        <xs:element name="string" type="value" minOccurs="0" maxOccurs="unbounded"/>
    </xs:choice>
</xs:group>

Но я получаю сообщение об ошибке: Обнаружен недопустимый контент, начиная с элемента 'switch'.Ожидается один из {{param, output} '.Есть хитрость.

Если maxOccurs="unbounded" перемещен из элементов в элемент choice в схеме, то любой из элементов может появляться в любом порядке в любое количество раз.

Однако, когда я это делаю, я получаю сообщение об ошибке: Атрибут 'maxOccurs' не может появиться в элементе 'choice'

Я прошел через Интернет, но все еще не нашел то, что я 'ищу.

1 Ответ

5 голосов
/ 23 февраля 2011

Вы можете поместить три типа элементов в выбор, а затем поместить выбор в последовательность в другой последовательности.

  <xs:group name="mygr">
    <xs:choice>
      <xs:element name="string"></xs:element>
      <xs:element name="param"></xs:element>
      <xs:element name="switch"></xs:element>
      <xs:element name="env"></xs:element>
    </xs:choice>
  </xs:group>

  <xs:element name="root">
    <xs:complexType>
      <xs:sequence >
        <xs:sequence minOccurs="1" maxOccurs="unbounded">
          <xs:group ref="mygr"/>
        </xs:sequence>
        <xs:element name="output"></xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

Это то, что у вас уже было, но вывод выводится на уровень выше.

...