我试图在XSD中表示以下DTD片段: -
(A | B)* | (A | C)* | (A | D)* | ...
即。任意数量的As和任意数量的一个的B,C,D ......的混合列表。
CastorConverter吐出: -
<choice>
<choice minOccurs="0" maxOccurs="unbounded">
<element ref="tns:A" />
<element ref="tns:B" />
</choice>
<choice minOccurs="0" maxOccurs="unbounded">
<element ref="tns:A" />
<element ref="tns:C" />
</choice>
<choice minOccurs="0" maxOccurs="unbounded">
<element ref="tns:A" />
<element ref="tns:D" />
</choice>
</choice>
但是这给了我一个解析器错误。使用visual studio进行调查会发出以下警告: -
“元素'A'的多重定义导致内容模型变得模糊。必须形成内容模型,使得在元素信息项序列的验证期间,粒子直接,间接或隐含地包含在其中以尝试依次验证序列中的每个项目可以唯一确定,而无需检查该项目的内容或属性,也没有关于序列其余部分中的项目的任何信息。“
问题似乎是,如果解析器遇到“A”,则需要“预测”序列的其余部分,以确定要验证的选项。
我是否可以通过另一种方式在XSD中表示此序列?
答案 0 :(得分:2)
使用序列,如下所示:
<sequence minOccurs="0">
<element minOccurs="0" maxOccurs="unbounded" ref="tns:A" />
<choice>
<sequence>
<element minOccurs="1" maxOccurs="unbounded" ref="tns:B" />
<sequence minOccurs="0" maxOccurs="unbounded">
<element maxOccurs="unbounded" ref="tns:A" />
<element minOccurs="0" maxOccurs="unbounded" ref="tns:B" />
</sequence>
</sequence>
<sequence>
<element minOccurs="1" maxOccurs="unbounded" ref="tns:C" />
<sequence minOccurs="0" maxOccurs="unbounded">
<element maxOccurs="unbounded" ref="tns:A" />
<element minOccurs="0" maxOccurs="unbounded" ref="tns:C" />
</sequence>
</sequence>
<sequence>
<element minOccurs="1" maxOccurs="unbounded" ref="tns:D" />
<sequence minOccurs="0" maxOccurs="unbounded">
<element maxOccurs="unbounded" ref="tns:A" />
<element minOccurs="0" maxOccurs="unbounded" ref="tns:D" />
</sequence>
</sequence>
</choice>
</sequence>
alt text http://www.freeimagehosting.net/uploads/29c07bafa2.png