我看了很多帖子而没有找到答案......
我有一个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。
感谢您的建议!
答案 0 :(得分:0)
我想要的是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
答案 1 :(得分:0)
你已经遇到了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>
答案 2 :(得分:0)
感谢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>
因为第四个元素仍然存在'独特的粒子归因'错误。
再次感谢!