我正在处理许多xsd文件。我注意到有几种基于xsd:token和xsd:string的类型定义没有任何限制。例如
<xsd:complexType name="BaseString">
<xsd:simpleContent>
<xsd:extension base="xsd:token"/>
</xsd:simpleContent>
</xsd:complexType>
我想知道这种定义是否有原因。为什么不使用xsd:token或xsd:string而不是BaseString类型? 任何的想法?
答案 0 :(得分:4)
它看起来不是很好的设计,但它取决于你没有用这个例子向我们展示的更广泛的背景。
我见过定义专用ID的模式。假设您的域名为FooObjects
。它们由FooObjectIDs
标识。通常,FooObjectID
将被定义为FooObjectIDType
类型。该类型反过来可能被定义为xsd:token
或xsd:string
的扩展名。该类型将FooObjectID区分为与香草字符串不同(因此处理不同)。
有时,当ID为“智能ID”(实际上是复合值)时,您会看到此信息。想象一下客户ID看起来像:CUST-VA-3391
。在所有数据管理中通常发现的糟糕设计是这些“智能密钥”,它们对ID中的多条信息进行编码(弗吉尼亚州客户#3391)。像这样的ID的类型(根据我的经验)经常看起来像你在这里的类型。
添加人工类型以区分这个特殊事物和一个香草字符串,但是懒惰导致缺乏对vanilla底层类型(xsd:token,xsd:string)的限制/不区分。
底线 - 您可以创建派生类型,以便为类型添加一些额外的语义;它不是一个香草字符串,它是FooObjectID
。但良好的做法往往表明进一步的延伸/限制是合适的。
答案 1 :(得分:2)
您显示的表单的定义通过为其提供比xsd:token更具信息性的名称来帮助记录该类型的预期用途。它们还有助于防止不恰当的派生和替换(帽子大小和测验等级可能都是小整数,但它们实际上是不可互换的。)
当然,正如FrobberOfBits所观察到的那样,通常有机会使用模式或其他方面进一步限制类型。像所示的衍生品可能缺少这样的机会;我比FrobberOfBits更不自信,这必然是糟糕设计的标志。