XML 架构:如何更改文档中所有字符串的最大长度

XML schema: How to change the maxLength of all strings in document

我想在一个地方设置 xsd:string 的架构范围 maxLength 值,并将其应用于任何使用 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"

的所有元素

您混淆了内置类型和用户定义类型。

Built-in/primitive 类型是用于创建用户定义类型的基本构建块。您不能直接更改内置类型。

您将 xsd:simpleType 定义为 xsd:stringxsd:restriction 并在需要时使用该用户定义类型的想法是正确的。只是不要将长度烘烤到类型的名称中。 (此外,类型名称应该是基于域的,而不是基于实现的。)这样你就可以在一个地方根据要求调整 50

最后,请注意一个更值得您注意的维护问题涉及 XSD 与现有文档、代码、API 等的版本控制,如果您真的想更改 50已发布 XSD.

就我个人而言,我认为在所有字符串上定义 50 个字符的全局限制是一个非常糟糕的设计选择。让人想起穿孔卡片的时代。

用户无法更改 xs:string 等内置类型的语义。正如您所建议的,您需要定义一个子类型。如果你想在所有地方都使用相同的 xs:string 子类型,你将不得不在所有地方进行更改。有多种方法可以使执行全局替换的过程自动化,但必须是全局替换。