XSD强制使用具有属性的元素的特定顺序

时间:2010-03-01 12:05:17

标签: xml xsd

我有一个类似下面的XML文件

 <transaction name="TEST_EX" type="singletonComplex">
  <vo class="svc.vo.UserProfile">
   <field deepMapping="true">
    <vo class="svc.vo.UserVO">
     <field name="UserName" column="User_Name" type="String"/>
     <field name="Age" column="User_Age" type="Integer"/>
    </vo>
   </field>
   <field name="Address1" column="Address_1" type="String"/>
   <field name="Address2" column="Address_2" type="String"/>
  </vo>
 </transaction>

里面有几个字段。某些字段已将deepMapping设置为true。我想确保,如果启用了deepMapping,那么它应该首先列出,即。在Address1Address2之前。我已经创建了一个XSD文件,但我不确定如何在该XSD文件中实现它。

3 个答案:

答案 0 :(得分:2)

您不能使元素(或属性)的内容依赖于另一个元素的内容。 XML Schema不支持这一点。您将不得不在其上使用其他一些验证机制。

答案 1 :(得分:1)

您是否能够更改XML结构?如果是,我建议添加一个新的XML元素,用启用的deepMapping对所有字段进行分组,例如:

 <transaction name="TEST_EX" type="singletonComplex">
  <vo class="svc.vo.UserProfile">
   <deepMapping>
    <vo class="svc.vo.UserVO">
     <field name="UserName" column="User_Name" type="String"/>
     <field name="Age" column="User_Age" type="Integer"/>
    </vo>
   </deepMapping>
   <field name="Address1" column="Address_1" type="String"/>
   <field name="Address2" column="Address_2" type="String"/>
  </vo>
 </transaction>

您在顶部放置deepMapping =“true”的所有字段的请求或多或少是一组字段。

答案 2 :(得分:0)

正如xcut所说,你不能用XML Schema做到这一点。你可以做的是使用两个具有相同复杂类型的不同元素名称:

 <xs:complexType name="fieldType">
    <xs:sequence>
      <xs:element name="field" maxOccurs="unbounded">
        <!--  .... -->
      </xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:element name="vo">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="deepMappedField" type="fieldType" minOccurs="0"/>
        <xs:element name="field" type="fieldType" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>