Xml 序列和选择中的XSD验证
我看了很多帖子都没有找到答案 我有一个XSD来验证我的XML,我遇到了一些问题 这里是我的XSD的一部分Xml 序列和选择中的XSD验证,xml,validation,xsd,Xml,Validation,Xsd,我看了很多帖子都没有找到答案 我有一个XSD来验证我的XML,我遇到了一些问题 这里是我的XSD的一部分 它工作得很好,但这并不完全是我想要做的。我想要一个更像这样的模式: <xsd:element name="Tree"> <xsd:complexType> <xsd:sequence> <xsd:group ref="Element" minOccurs="0" maxOccurs="unbound
它工作得很好,但这并不完全是我想要做的。我想要一个更像这样的模式:
<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的实例时,如果不进行前瞻,就无法判断它是匹配对group元素的第一个引用还是第二个引用。(不要问为什么负责任的工作组中有人认为讲这个故事很重要;这是一个乏味而令人沮丧的故事。) 因此,您需要在声明中稍作修改:
<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>
多亏了C.M.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>
因为第四个元素仍然存在“独特粒子属性”错误
再次感谢 抱歉,无法复制该结果。一旦新xsd:choice元素上的maxOccurs=“0”被更正为minOccurs=“0”(假设您并不真正想要minOccurs=“1”和maxOccurs=“0”,这就是您现在所拥有的),此声明中就没有错误。当然,正如您所注意到的,您必须在choice指示符中更改maxOccurs by minOccurs。谢谢你的评论,这篇文章已经编辑过了。
<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>