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

时间:2018-01-03 19:17:58

标签: xml xsd xsd-validation xml-validation standards-compliance

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

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

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

我们想要检查的一些事情:

  1. 一个简单的元素名称应始终是带有前导的camelcase 大写。它也应该以{{1​​}}结束。
  2. 复杂项目也应采用前导大写字母,但应以SType结尾。
  3. 如果简单类型包含枚举限制,则应以CType结尾。
  4. 如果复杂类型仅包含简单类型的列表,则应始终以QualifierSType结尾。
  5. 是否有一些标准工具可以完成这些验证,或者我们是否必须自己开发一些东西?什么是实现这一目标的最佳方法?

1 个答案:

答案 0 :(得分:0)

我通过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()只是一个小实用程序函数,允许组织通过配置文件中的条目选择退出任何给定的约定。)