如何删除以下 xsd 中的排序限制:
<xs:element name="example">
<xs:sequence>
<xs:element name="hostname" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="filename" type="xs:string" minOccurs="1" maxOccurs="1"/>
<xs:element name="chunks" type="xs:string" minOccurs="1" maxOccurs="unbonded"/>
</xs:sequence>
</xs:element>
所以最后应该验证以下xml
<example>
<chunks>...</chunks>
<filename>...</filename>
<chunks>...</chunks>
</example>
<!-- -->
<example>
<filename>...</filename>
<chunks>...</chunks>
<chunks>...</chunks>
</example>
<!-- -->
<example>
<filename>...</filename>
<chunks>...</chunks>
<chunks>...</chunks>
<hostname>...</hostname>
</example>
接受的解决方案:
<xs:element name="example">
<xs:all>
<xs:element name="hostname" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="filename" type="xs:string" minOccurs="1" maxOccurs="1"/>
<xs:element name="chunks" type="xs:string" minOccurs="1" maxOccurs="unbonded"/>
</xs:all>
</xs:element>
最佳答案
您可以通过 sequence
的组合实现这一目标和 choice
在几种可能的组合中重复元素,以确保存在所需的元素,但它不会那么好和简单。我会建议不同的设计(如果可能的话)。
你的<chunks>
有什么原因吗?元素可以出现在任何地方?如果您正在设计 XML,决定哪些限制实际上是必要的,哪些应该灵活,将简化生成和处理(以及验证)。将它们按顺序排列或包装它们将使它们被视为 group
并且将使验证更容易(它还会简化语言映射,例如,包装的相同元素经常被映射为数组)。
将相似元素放在一起的一种形式是 sequence
,你不想要的。另一种方法是将其包装在一个类型中并使用 xs:all
:
<xs:element name="example">
<xs:complexType>
<xs:all>
<xs:element name="filename" type="xs:string" minOccurs="1" maxOccurs="1"/>
<xs:element name="hostname" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="chunks" type="ChunksType" minOccurs="1" maxOccurs="1"/>
</xs:all>
</xs:complexType>
</xs:element>
<xs:complexType name="ChunksType">
<xs:sequence>
<xs:element name="chunk" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
这将验证这样的 XML 片段:
<example>
<chunks>
<chunk>...</chunk>
<chunk>...</chunk>
</chunks>
<filename>...</filename>
</example>
<!-- -->
<example>
<filename>...</filename>
<chunks>
<chunk>...</chunk>
<chunk>...</chunk>
</chunks>
</example>
<!-- -->
<example>
<filename>...</filename>
<chunks>
<chunk>...</chunk>
</chunks>
<hostname>...</hostname>
</example>
<example>
<hostname>...</hostname>
<filename>...</filename>
<chunks>
<chunk>...</chunk>
<chunk>...</chunk>
</chunks>
</example>
失败的是:
<!-- missing filename -->
<example>
<chunks>
<chunk>...</chunk>
<chunk>...</chunk>
</chunks>
</example>
<!-- no chunks block -->
<example>
<filename>...</filename>
<hostname>...</hostname>
</example>
<!-- empty chunks block -->
<example>
<hostname>...</hostname>
<filename>...</filename>
<chunks></chunks>
</example>
你不能只放置你的 unbounded
xs:all
中的元素因为它只允许 0
或 1
.您不能使用一系列选择,因为您有必需的元素。你不能结合 xs:all
与 sequence
这将解决您的问题(实际上您可以做其中的一些事情,但如果您使用的是 XSD 1.1)。
在 XSD 1.1 中,您可以拥有 xs:all
与 unbounded
元素,以便您可以使用以下方法验证您的 XML:
<xs:all>
<xs:element name="filename" type="xs:string" minOccurs="1" maxOccurs="1"/>
<xs:element name="hostname" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="chunks" type="xs:string" minOccurs="1" maxOccurs="unbounded"/>
</xs:all>
这在 XSD 1.0 中是非法的。
关于xml - 我怎样才能从 xsd 序列中删除排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23103526/