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:string
的 xsd:restriction
并在需要时使用该用户定义类型的想法是正确的。只是不要将长度烘烤到类型的名称中。 (此外,类型名称应该是基于域的,而不是基于实现的。)这样你就可以在一个地方根据要求调整 50
。
最后,请注意一个更值得您注意的维护问题涉及 XSD 与现有文档、代码、API 等的版本控制,如果您真的想更改 50
已发布 XSD.
就我个人而言,我认为在所有字符串上定义 50 个字符的全局限制是一个非常糟糕的设计选择。让人想起穿孔卡片的时代。
用户无法更改 xs:string 等内置类型的语义。正如您所建议的,您需要定义一个子类型。如果你想在所有地方都使用相同的 xs:string 子类型,你将不得不在所有地方进行更改。有多种方法可以使执行全局替换的过程自动化,但必须是全局替换。
我想在一个地方设置 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:string
的 xsd:restriction
并在需要时使用该用户定义类型的想法是正确的。只是不要将长度烘烤到类型的名称中。 (此外,类型名称应该是基于域的,而不是基于实现的。)这样你就可以在一个地方根据要求调整 50
。
最后,请注意一个更值得您注意的维护问题涉及 XSD 与现有文档、代码、API 等的版本控制,如果您真的想更改 50
已发布 XSD.
就我个人而言,我认为在所有字符串上定义 50 个字符的全局限制是一个非常糟糕的设计选择。让人想起穿孔卡片的时代。
用户无法更改 xs:string 等内置类型的语义。正如您所建议的,您需要定义一个子类型。如果你想在所有地方都使用相同的 xs:string 子类型,你将不得不在所有地方进行更改。有多种方法可以使执行全局替换的过程自动化,但必须是全局替换。