[英]XSD validation in a sequence and choice
我看了很多帖子却找不到答案...
我有一个XSD来验证我的XML,但是遇到一些问题。
这是我的XSD(的一部分)
<xsd:group name="Element">
<xsd:sequence>
<xsd:choice>
<xsd:element ref="El1" />
<xsd:element ref="El2" />
</xsd:choice>
</xsd:sequence>
</xsd:group>
<xsd:element name="Tree">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="El3" minOccurs="0" maxOccurs="1" />
<xsd:group ref="Element" minOccurs="0" maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
它工作正常,但这并不是我想要做的全部。 我想要一个更像这样的模式:
<xsd:element name="Tree">
<xsd:complexType>
<xsd:sequence>
<xsd:group ref="Element" minOccurs="0" maxOccurs="unbounded" />
<xsd:element ref="El3" minOccurs="0" maxOccurs="1" />
<xsd:group ref="Element" minOccurs="0" maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
但是这种模式是错误的。
我想要的是未排序的El1或El2列表,以及一个(只有一个)El3。
谢谢你的建议 !
我想要的是未排序的El1或El2列表,以及一个(只有一个)El3。
我读为
(e1 | e2)*(e3,(e1 | e2)*)?
那是
sequence
choice max=unbounded
E1
E2
/choice
sequence min=0
E3
choice max=unbounded
E1
E2
/choice
/sequence
/sequence
您已经遇到了XSD的“唯一粒子归因”陷阱(对应于XML DTD的“确定性”陷阱和SGML DTD的“非歧义”陷阱)。 XSD不会接受您的内容模型,因为当遇到一个元素El1的实例作为Tree元素的第一个子元素时,如果不先行就无法知道它是否与对组Element的第一个引用相匹配或与第二个元素相匹配。 (不要问为什么负责任的工作组中的任何人都认为这很重要;这是一个乏味而令人沮丧的故事。)
因此,您需要在声明中稍作改动:
<xsd:element name="Tree">
<xsd:complexType>
<xsd:sequence>
<xsd:group ref="Element"
minOccurs="0" maxOccurs="unbounded" />
<xsd:sequence minOccurs="0" maxOccurs="1">
<xsd:element ref="El3"/>
<xsd:group ref="Element"
minOccurs="0" maxOccurs="unbounded" />
<xsd:sequence>
</xsd:sequence>
</xsd:complexType>
多亏了CM Sperberg-McQueen,我在第二个顺序周围用了一个选择指示器来稍微修改您的建议:
<xsd:element name="Tree">
<xsd:complexType>
<xsd:sequence>
<xsd:group ref="Element" minOccurs="0" maxOccurs="unbounded" />
<xsd:choice minOccurs="0">
<xsd:sequence minOccurs="0">
<xsd:element ref="El3"/>
<xsd:group ref="Element" minOccurs="0" maxOccurs="unbounded" />
<xsd:element ref="El4" minOccurs="0"/>
</xsd:sequence>
<xsd:element ref="El4"/>
</xsd:choice>
</xsd:sequence>
</xsd:complexType>
因为我还有第四个元素的“唯一粒子归因”错误。
再次感谢 !
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.