组的顺序和元素的顺序

时间:2013-06-24 05:06:27

标签: html xsd xsd-validation

我有一个场景,<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>

1 个答案:

答案 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可能导致问题。