2

我知道alland choice,但它们并没有说明我确实希望某些元素能够多次出现的情况,例如:

<Root>
    <ThingA/>
    <ThingB/>
    <ThingC/>
    <ThingC/>
    <ThingC/>
</Root>

我可以使用sequence,但我更愿意让这些孩子按任何顺序排列。我可以使用any,但我不能拥有超过一个ThingC。我可以使用choice,但我无法将ThingAand限制ThingB为 0 或 1。

我想我可能在某处读到过,这在 XSD 中要么困难要么不可能,但使用 RELAX NG 可能是可能的。不幸的是,我不记得我在哪里读到的。

谢谢你的帮助!

4

1 回答 1

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>

您在 XML Schema 中的选项是:

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

事实证明,第三种通常是最好的选择;XML 生成器以特定顺序输出元素通常不会花费太多成本,而且它不仅有助于验证,而且如果可以提前知道顺序,它还有助于 XML 的使用。

于 2008-09-19T19:08:58.057 回答