我有一个场景,<body>
上有一个序列约束,让孩子<a>
后跟<b>
<body>
<a />
<b />
</body
但是,<a>
和<b>
是群组的一部分,所以我的XSD就像
<xs:element name="body">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:group where <a> defined />
<xs:group where <b> defined />
</xs:sequence>
我收到的数据为<b>
,后跟<a>
,
<body>
<b />
<a />
</body
数据正在成功验证,而我期望它失败,因为它不遵守序列。是否验证器无法在<xs:sequence>
内识别组序列(当组中的元素定义时)。请建议??
此外,当我将它们定义为<xs:sequence>
中的元素时,数据对模式的数据失败,但当这些元素在组中并且组中的组被引用时,相同的情况也不会失败。 <xs:sequence>
。
答案 0 :(得分:0)
我只是尝试了,它似乎按照您的预期工作
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" targetNamespace="test" xmlns:test="test">
<xs:group name="a_group">
<xs:sequence>
<xs:element name="a" type="xs:string" />
</xs:sequence>
</xs:group>
<xs:group name="b_group">
<xs:sequence>
<xs:element name="b" type="xs:string" />
</xs:sequence>
</xs:group>
<xs:element name="body">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:group ref="test:a_group" />
<xs:group ref="test:b_group" />
</xs:sequence>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
以下xml将验证
<?xml version="1.0" encoding="UTF-8"?>
<body xsi:schemaLocation="test test.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="test">
<a />
<b />
</body>
以下不会
<?xml version="1.0" encoding="UTF-8"?>
<body xsi:schemaLocation="test test.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="test">
<b />
<a />
</body>
我在Altova测试过它。你用什么验证?
我对一些Java应用程序有一些奇怪的经验:当我choice
后跟sequence
(它们之间没有元素)时,就像只有choice
被声明一样(即在{之间选择} {1}}和<a />
。(同样<b />
包含sequence
仅与choice
一样。)
因此,如果情况相似,那么sequence
可能导致问题。