具有属性和限制的XSD自定义类型

时间:2012-08-09 19:15:27

标签: xsd xsd-validation

我正在开发一个XSD文档来验证XML导入文件。导入文件的几乎所有元素都可以具有ID属性(UPDATE)。 UPDATE属性必须限制为4个可能的值,所以我有这个预设类型用于属性限制......

<xs:simpleType name="MyUpDir">
  <xs:restriction base="xs:string">
    <xs:enumeration value="OVERWRITE"/>
    <xs:enumeration value="ADDONLY" />
    <xs:enumeration value="NOERASE" />
    <xs:enumeration value="IGNORE" />
  </xs:restriction>
</xs:simpleType>

除了属性限制外,每个元素的值都受到各种预设自定义类型的限制 例如:

<xs:simpleType name="MyChar50">
  <xs:restriction base="xs:string">
    <xs:maxLength value="50" />
  </xs:restriction>
</xs:simpleType>

要结合这两者,我知道我可以在线对每个元素进行如下操作:

<xs:element name="FullName">
  <xs:complexType>
    <xs:simpleContent>
      <xs:extension base="MyChar50">
        <xs:attribute name="UPDATE" type="MyUpDir" />
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
</xs:element>

问题是导入文件中有超过1000个元素,每个元素都有不同的长度/ regEx /精度限制(大约20个自定义类型),并且可能具有UPDATE属性。如果没有UPDATE属性,我可以使用自定义类型在自己的行上执行每个元素,从而大大减少了XSD的“内容”部分。但是从我读过的内容来看,为了适应自定义类型和所提到的属性的潜力,我不得不使用扩展的示例(最后一个示例),而不是为每个这样的元素保留一行。有没有办法通过创建一个结合两者的自定义类型来进一步减少这种情况?

1 个答案:

答案 0 :(得分:0)

我认为你可以做20多个自定义类型(总共40个),然后使用适当的(w /或w / o属性)。在你的情况下:

<xs:complexType name="MyChar50Attr"><!-- This one has attributes -->
    <xs:simpleContent>
        <xs:extension base="MyChar50">
            <xs:attribute name="UPDATE" type="MyUpDir"/>
        </xs:extension>
    </xs:simpleContent>
</xs:complexType>
<xs:element name="FullName" type="MyChar50Attr"/>