繁体   English   中英

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

[英]XSD - Elements in any order and count (XML validated by XERCES using XSD)

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

我可以只使用sequenceallchoice ,但没有一个满足我的要求。 顺序 - 按照确切的顺序进行任意次数。 全部 - 任何顺序为零或一次。 选择 - 只有其中一个。 在这个网站上找到了一个解决方案 ,但它不适用于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'中

我穿过互联网巡航,但我仍然没有找到我正在寻找的东西。

您可以将三种元素类型放在一个选项中,然后将选择按顺序放在另一个序列中。

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

这是你已经拥有的,但输出水平更高。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM