我正在尝试验证XML,如下所示。我有3个元素name
,age
,address
必须按顺序声明(因此序列标记)。但是,应该允许在任何地方显示作业元素(即:在此序列元素之前或之后)。这是否可以使用XSD验证?目前我只能接受它在这些元素之后被添加,因为它是在序列中的位置。我也尝试将xs:choice
与xs:sequence
混合,但没有成功。
<xs:complexType name="PersonNode">
<xs:sequence>
<xs:element name="name" type="tns:StringLabel"/>
<xs:element name="age" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="job" type="xs:string" minOccurs="0"/>
</xs:sequence>
<xs:attribute name="valid" type="xs:boolean"/>
</xs:complexType>
答案 0 :(得分:2)
如果job
不必是可选的,您可以使用xs:choice
来实现所需的约束,如下所示:
<xs:complexType name="PersonNode">
<xs:choice>
<xs:sequence>
<xs:element name="name" type="tns:StringLabel"/>
<xs:element name="age" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="job" type="xs:string"/>
</xs:sequence>
<xs:sequence>
<xs:element name="job" type="xs:string"/>
<xs:element name="name" type="tns:StringLabel"/>
<xs:element name="age" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
</xs:sequence>
</xs:choice>
<xs:attribute name="valid" type="xs:boolean"/>
</xs:complexType>
但是,这假设job
需要在一个地方或另一个地方;否则,这将与独特的粒子归因相冲突。 [更新:不要错过C. M. Sperberg-McQueen在评论中允许job
成为可选项的想法。通过将第二选择专用于领先的job
案例,同时让第一选择涵盖无job
和尾随job
案例,它巧妙地绕过UPA。]
考虑到所有事项,我建议您采用原始方法,并放弃job
允许在PersonNode
内容模型中的两个不同位置出现的要求。我无法告诉你,有多少次我看到人们为了纯粹的理论问题而允许元素无序化,这只会使实践中的问题复杂化。