如何验证 XML 架构中的命名约定
How to validate naming conventions in an XML Schema
我们正在为公司内部使用的 XML 架构 (XSD) 制定命名约定。
为了确保每个人都会遵守约定,我正在寻找一种方法来验证 XSD。
我们使用的 IDE 是 IntelliJ,因此它应该能够使用 XSD 文件来验证其他 XSD 文件。
一种方法是使用 W3C 的 XSD 标准的扩展版本,但这有一些影响。
另一种是只写一些 Python 或 Java 代码来验证我们的特定约定,但这感觉有点奇怪。
我们要检查的一些内容:
- 一个简单的元素名称应该总是带有前导的驼峰式
大写。它也应该以
SType
结束。
- 一个复杂的项目也应该以驼峰式首字母大写,但它应该以
CType
. 结尾
- 如果简单类型包含枚举限制,则应以
QualifierSType
结束。
- 如果一个复杂类型只包含一个简单类型的列表,它应该总是以
ListCType
结束。
是否有一些标准工具可以完成这些验证,还是我们必须自己开发一些东西?实现这一目标的最佳方法是什么?
我已经通过 Schematron 自动化 WIPO ST.96 XML Design Rules and Conventions 一致性。许多规则很容易表示,但是一些命名约定(例如 CamelCase)需要一些严格的字典驱动代码。考虑:
- GD-10:类型名称必须使用 UCC 约定并具有后缀 Type。例如,ApplicantType.
我们决定放弃完整的 UCC 验证所需的复杂词汇,但至少检查名称是否以大写字母开头,不是全部大写,并以所需的后缀结尾:
<pattern>
<title>GD-10</title>
<rule context="xsd:complexType[@name] | xsd:simpleType[@name]">
<assert test="fnx:is-exception('GD-10')
or matches(@name,'^[A-Z]')" flag="AUTO" role="ERROR">
The <value-of select="local-name()"/> name <value-of
select="@name"/> does not start with an upper-case letter.
</assert>
<assert test="fnx:is-exception('GD-10') or
not(matches(@name,'^[A-Z]+$'))"
flag="AUTO" role="ERROR">
The <value-of select="local-name()"/> name <value-of
select="@name"/> contains all upper-case letters instead of
using camel case.
</assert>
<assert test="fnx:is-exception('GD-10') or
ends-with(@name,'Type')" flag="AUTO" role="ERROR">
The <value-of select="local-name()"/> name <value-of
select="@name"/> does not end with Type.
</assert>
</rule>
</pattern>
(fnx:is-exception()
只是一个小实用函数,允许组织通过配置文件中的条目选择退出任何给定约定。)
我们正在为公司内部使用的 XML 架构 (XSD) 制定命名约定。
为了确保每个人都会遵守约定,我正在寻找一种方法来验证 XSD。
我们使用的 IDE 是 IntelliJ,因此它应该能够使用 XSD 文件来验证其他 XSD 文件。
一种方法是使用 W3C 的 XSD 标准的扩展版本,但这有一些影响。 另一种是只写一些 Python 或 Java 代码来验证我们的特定约定,但这感觉有点奇怪。
我们要检查的一些内容:
- 一个简单的元素名称应该总是带有前导的驼峰式
大写。它也应该以
SType
结束。 - 一个复杂的项目也应该以驼峰式首字母大写,但它应该以
CType
. 结尾
- 如果简单类型包含枚举限制,则应以
QualifierSType
结束。 - 如果一个复杂类型只包含一个简单类型的列表,它应该总是以
ListCType
结束。
是否有一些标准工具可以完成这些验证,还是我们必须自己开发一些东西?实现这一目标的最佳方法是什么?
我已经通过 Schematron 自动化 WIPO ST.96 XML Design Rules and Conventions 一致性。许多规则很容易表示,但是一些命名约定(例如 CamelCase)需要一些严格的字典驱动代码。考虑:
- GD-10:类型名称必须使用 UCC 约定并具有后缀 Type。例如,ApplicantType.
我们决定放弃完整的 UCC 验证所需的复杂词汇,但至少检查名称是否以大写字母开头,不是全部大写,并以所需的后缀结尾:
<pattern>
<title>GD-10</title>
<rule context="xsd:complexType[@name] | xsd:simpleType[@name]">
<assert test="fnx:is-exception('GD-10')
or matches(@name,'^[A-Z]')" flag="AUTO" role="ERROR">
The <value-of select="local-name()"/> name <value-of
select="@name"/> does not start with an upper-case letter.
</assert>
<assert test="fnx:is-exception('GD-10') or
not(matches(@name,'^[A-Z]+$'))"
flag="AUTO" role="ERROR">
The <value-of select="local-name()"/> name <value-of
select="@name"/> contains all upper-case letters instead of
using camel case.
</assert>
<assert test="fnx:is-exception('GD-10') or
ends-with(@name,'Type')" flag="AUTO" role="ERROR">
The <value-of select="local-name()"/> name <value-of
select="@name"/> does not end with Type.
</assert>
</rule>
</pattern>
(fnx:is-exception()
只是一个小实用函数,允许组织通过配置文件中的条目选择退出任何给定约定。)