2012-08-09 100 views
4

我正在开发一个XSD文档来验证XML导入文件。几乎导入文件'可以'的所有元素都有一个ID属性(UPDATE)。更新属性必须限制在4个可能的值,因此我有这个预先设定的类型用于属性限制...带属性和限制的XSD自定义类型

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

回答

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"/> 
+0

足够简单...我可以发誓我试过,但得到了某种类型的错误,并打折得太早。我想这个错误可能是在扩展基础或其他方面,而不是方法论。下次我会更加关注。 :)谢谢。这完美地工作,并且将使XSD更容易在需要将来更新时进行解密。 – 2012-08-10 15:46:21