XSD-任意顺序和数量的元素(由XERCES使用XSD验证的XML)

我对XML模式有疑问.我需要在一种元素内部放入三种类型的元素,但没有任何其他限制,紧接着是元素输出的一种出现:

<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>

我可以只使用顺序,全部或选择,但是没有一个可以满足我的要求.顺序-完全按照任意次数排列.全部-零次或一次(任意顺序).选择-只有其中之一.我已经找到one solution on this web,但是它不适用于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’开始发现无效的内容.预期为“ {参数,输出}”之一.有个把戏.

If maxOccurs="unbounded" is moved
from elements to element choice in
schema, then can any of elements
appear in any order in any number of
times.

但是,执行此操作时,出现错误:属性’maxOccurs’无法出现在元素’choice’中

我在互联网上巡游,但仍然找不到我想要的东西.

最佳答案
您可以将三种元素类型放入选择中,然后将选择放入另一个序列中.

  <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>

这是您已经拥有的,但是输出会更高.

转载注明原文:XSD-任意顺序和数量的元素(由XERCES使用XSD验证的XML) - 代码日志