У меня проблема с 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 не может отображаться в элементе selection
Я путешествовал по Интернету, но все еще не нашел то, что искал.