如何验证 XML 架构中的命名约定

How to validate naming conventions in an XML Schema

我们正在为公司内部使用的 XML 架构 (XSD) 制定命名约定。
为了确保每个人都会遵守约定,我正在寻找一种方法来验证 XSD。

我们使用的 IDE 是 IntelliJ,因此它应该能够使用 XSD 文件来验证其他 XSD 文件。

一种方法是使用 W3C 的 XSD 标准的扩展版本,但这有一些影响。 另一种是只写一些 Python 或 Java 代码来验证我们的特定约定,但这感觉有点奇怪。

我们要检查的一些内容:

  1. 一个简单的元素名称应该总是带有前导的驼峰式 大写。它也应该以 SType 结束。
  2. 一个复杂的项目也应该以驼峰式首字母大写,但它应该以 CType.
  3. 结尾
  4. 如果简单类型包含枚举限制,则应以 QualifierSType 结束。
  5. 如果一个复杂类型只包含一个简单类型的列表,它应该总是以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() 只是一个小实用函数,允许组织通过配置文件中的条目选择退出任何给定约定。)