在W3C的XML模式语言(XSD)中是否可以允许一系列元素按任何顺序排列但仍限制出现次数?
时间:2020-03-06 14:27:12 来源:igfitidea点击:
我了解all和choice,但是它们并不能解决我确实希望某些元素能够多次出现的情况,例如:
<Root>
<ThingA/>
<ThingB/>
<ThingC/>
<ThingC/>
<ThingC/>
</Root>
我可以使用sequence,但是我更希望允许这些子元素以任何顺序排列。我可以使用any,但是不能超过一个ThingC。我可以使用choice,但是不能将ThingA和ThingB限制为0或者1.
我想我可能在某处已经读到这在XSD中是困难的还是不可能的,但是使用RELAX NG可能是可能的。不幸的是,我不记得我在哪里读的书。
谢谢你的帮助!
解决方案
没错:我们无法在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模式中的选项是:
- 添加一个预处理步骤,该步骤正常化你的输入XML到特定的顺序,然后使用
<XS:序列> - 使用
<xs:choice>,并添加额外的验证(例如,使用Schematron)以检查是否存在不超过一个<ThingA>或者<ThingB> - 决定修改标记语言中元素的顺序
事实证明,第三个通常是最佳选择。 XML生成器按特定顺序输出元素通常没有多少成本,而且如果可以提前知道顺序,它不仅有助于验证,而且还有助于XML的使用。

