4

我正在开发一个 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 的“内容”部分。但是从我所读到的,似乎为了适应自定义类型和提到的属性的潜力,我被迫使用扩展示例(最后一个示例),而不是能够为每个这样的元素保留一行. 有没有办法通过创建结合两者的自定义类型来进一步减少这种情况?

4

1 回答 1

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"/>
于 2012-08-09T20:50:37.177 回答