是否有可能在W3C的XML Schema语言(XSD)中允许一系列元素以任何顺序但仍然限制出现?

Avi*_*lax 2 xml schema xsd

我知道all并且choice,但他们没有考虑我希望某些元素能够多次出现的情况,例如:

<Root>
    <ThingA/>
    <ThingB/>
    <ThingC/>
    <ThingC/>
    <ThingC/>
</Root>
Run Code Online (Sandbox Code Playgroud)

我可以使用sequence,但我更愿意让这些孩子处于任何顺序.我可以使用any,但后来我不能超过一个ThingC.我可以使用choice,但我不能限制ThingAThingB为0或1.

我想我可能已经读过某些地方,这在XSD中很难或不可能,但RELAX NG也许可能.不幸的是,我不记得我在哪里读到这些.

谢谢你的帮助!

Jen*_*niT 6

这是对的:你不能在XML Schema中做你想做的事,但你可以在RELAX NG中:

<element name="Root">
  <interleave>
    <element name="ThingA"><empty /></element>
    <element name="ThingB"><empty /></element>
    <oneOrMore><element name="ThingC"><empty /></element></oneOrMore>
  </interleave>
</element>
Run Code Online (Sandbox Code Playgroud)

您在XML Schema中的选项是:

  • 添加一个预处理步骤,将输入XML规范化为特定顺序,然后使用 <xs:sequence>
  • 使用<xs:choice>,并添加额外的验证(例如使用Schematron)来检查是否有多个<ThingA><ThingB>
  • 决定修复标记语言中元素的顺序

事实证明,第三种通常是最好的选择; 对于按特定顺序输出元素的XML生成器通常没有多少成本,它不仅有助于验证,而且如果可以提前知道订单,它还有助于消耗XML.