我想在一个地方设置架构范围的maxLength
值xsd:string
,并将其应用于任何使用xsd:string
。 例如,我想将任何和所有字符串限制为 50 个字符。
我知道我能做到...
<xsd:simpleType name="MaxLen50">
<xsd:restriction base="xsd:string">
<xsd:maxLength value="50"/>
</xsd:restriction>
</xsd:simpleType>
...
<xsd:element name="Foo" type="MaxLen50" />
<xsd:element name="Bar" type="MaxLen50" />
<xsd:element name="Baz" type="MaxLen50" />
。但问题是我必须转到 XSD 中的每个字符串并将其从xsd:string
更改为MaxLen50
. 我只想为xsd:string
设置默认值,并将其应用于所有具有type="xsd:string"
的元素
您混淆了内置类型和用户定义类型。
内置/基元类型是用于创建用户定义类型的基本构建块。 不要直接更改内置类型。
将xsd:simpleType
定义为xsd:string
xsd:restriction
并在需要时使用该用户定义类型时,您的想法是正确的。 只是不要将长度烘焙到类型名称中。 (此外,类型名称应基于域,而不是基于实现。 这样,您就可以在单个位置根据要求调整50
。
最后,请注意,如果您真的想在已发布的 XSD 中更改该50
,则更值得您注意的维护问题涉及 XSD 和现有文档、代码、API 等的版本控制。
就个人而言,我认为在所有字符串上定义 50 个字符的全局限制是一个非常糟糕的设计选择。它让人回到打孔卡的时代。
用户无法更改内置类型(如 xs:string(的语义。您需要按照您的建议定义一个子类型。如果你想在任何地方使用相同的xs:string子类型,你将不得不在任何地方进行更改。有各种各样的方法可以自动执行全局替换的过程,但必须进行全局替换。