我正在处理许多 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 类型? 任何的想法?
最佳答案
它看起来不是很好的设计,但它取决于更广泛的上下文,您没有通过这个示例向我们展示。
我见过定义专用 ID 的模式。假设您的域有 FooObjects
。它们由 FooObjectIDs
标识。通常,FooObjectID
将被定义为 FooObjectIDType
类型。该类型又可以定义为 xsd:token
或 xsd:string
的扩展。该类型将 FooObjectID 区分为不同于普通字符串(因此处理方式也不同于普通字符串)。
有时当 ID 是实际上是复合值的“智能 ID”时,您会看到这种情况。想象一下客户 ID 类似于:CUST-VA-3391
。在所有数据管理中,一个典型的糟糕设计是这些“智能 key ”,它们将多条信息编码在一个 ID 中(弗吉尼亚客户 #3391)。像这样的 ID 的类型(以我的经验)通常看起来像你在这里的类型。
添加人工类型是为了区分这个特殊的东西和普通字符串,但惰性导致缺乏限制/与普通底层类型(xsd:token、xsd:string)没有区别。
底线——您创建派生类型的部分目的是为该类型注入(inject)一些额外的语义;它不是原始字符串,而是 FooObjectID
。但良好做法往往表明进一步扩展/限制是适当的。
关于xml - 是否有理由根据 xsd :token or xsd:string 定义类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22957240/