【问题标题】:Is it possible in W3C's XML Schema language (XSD) to allow a series of elements to be in any order but still limit occurrences?在 W3C 的 XML Schema 语言 (XSD) 中是否有可能允许一系列元素按任何顺序排列但仍然限制出现?
【发布时间】:2010-09-11 09:07:53
【问题描述】:

我知道allchoice,但它们没有考虑到我确实希望某些元素能够多次出现的情况,例如:

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

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

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

感谢您的帮助!

【问题讨论】:

    标签: xml schema xsd


    【解决方案1】:

    没错:你不能在 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 规范化为特定顺序,然后使用 &lt;xs:sequence&gt;
    • 使用&lt;xs:choice&gt;,并添加额外的验证(例如使用Schematron)以检查&lt;ThingA&gt;&lt;ThingB&gt; 不超过一个
    • 决定修复标记语言中元素的顺序

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-15
      相关资源
      最近更新 更多