是否有理由基于xsd:token或xsd:string定义类型

时间:2014-04-09 08:46:56

标签: xml schema xsd

我正在处理许多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类型? 任何的想法?

2 个答案:

答案 0 :(得分:4)

它看起来不是很好的设计,但它取决于你没有用这个例子向我们展示的更广泛的背景。

我见过定义专用ID的模式。假设您的域名为FooObjects。它们由FooObjectIDs标识。通常,FooObjectID将被定义为FooObjectIDType类型。该类型反过来可能被定义为xsd:tokenxsd:string的扩展名。该类型将FooObjectID区分为与香草字符串不同(因此处理不同)。

有时,当ID为“智能ID”(实际上是复合值)时,您会看到此信息。想象一下客户ID看起来像:CUST-VA-3391。在所有数据管理中通常发现的糟糕设计是这些“智能密钥”,它们对ID中的多条信息进行编码(弗吉尼亚州客户#3391)。像这样的ID的类型(根据我的经验)经常看起来像你在这里的类型。

添加人工类型以区分这个特殊事物和一个香草字符串,但是懒惰导致缺乏对vanilla底层类型(xsd:token,xsd:string)的限制/不区分。

底线 - 您可以创建派生类型,以便为类型添加一些额外的语义;它不是一个香草字符串,它是FooObjectID。但良好的做法往往表明进一步的延伸/限制是合适的。

答案 1 :(得分:2)

您显示的表单的定义通过为其提供比xsd:token更具信息性的名称来帮助记录该类型的预期用途。它们还有助于防止不恰当的派生和替换(帽子大小和测验等级可能都是小整数,但它们实际上是不可互换的。)

当然,正如FrobberOfBits所观察到的那样,通常有机会使用模式或其他方面进一步限制类型。像所示的衍生品可能缺少这样的机会;我比FrobberOfBits更不自信,这必然是糟糕设计的标志。