XSD: 使用 Union 定义对 ID 类型的限制

XSD: Defining a Restriction on ID type with Union

我正在尝试将类型为 ID 的属性限制为两种类型的联合:

<attribute name="metaDataID" use="required">
  <simpleType>
    <union>
      <simpleType>
        <restriction base="ID">
          <enumeration value="from" />
          <enumeration value="to" />
          <enumeration value="cc" />
          <enumeration value="bcc" />
          <enumeration value="subject" />
          <enumeration value="sendTime" />
        </restriction>
      </simpleType>
      <simpleType>
        <restriction base="ID">
          <pattern value="attachment\d+-metadata" />
        </restriction>
      </simpleType>
    </union>
  </simpleType>
</attribute>

所以基本思想是属性值应该匹配枚举 {from/to/cc/bcc/subject/sendTime} 或模式 "attachment\d+-metadata".

使用 JAXB 验证时出现以下错误:

The attribute use 'metaDataID' in this type has type 'null', which is not validly derived from 'ID', the type of the matching attribute use in the base type.

这对我来说很有意义。 metaDataID 的新定义不再具有类型 ID。但是我无法在 simpleTypeunion 元素上指定类型,所以我不知道如何指定联合的结果也是 ID 类型。我也试过:

<attribute name="metaDataID" use="required">
  <simpleType>
    <restriction base="ID">
      <union>
        ...
      </union>
    </restriction>
  </simpleType>
</attribute>

但限制不允许在它们下面存在联合。这可能吗?

XSD 1.0 在对从 ID 派生的类型执行 ID 约束时有点晦涩;我希望处理器在像这样的示例中的行为因实现而异。

如果您放弃联合并使用更复杂的模式在单个限制步骤中派生出您想要的类型,您可能会获得更好的结果:

  <simpleType>
    <restriction base="ID">
      <pattern value="from" />
      <pattern value="to" />
      <pattern value="cc" />
      <pattern value="bcc" />
      <pattern value="subject" />
      <pattern value="sendTime" />
      <pattern value="attachment\d+-metadata" />
    </restriction>
  </simpleType>

XSD 1.1(我认为)更明确一些。因此,如果您可以使用 XSD 1.1 处理器,您也可能会获得更好的结果。

I am trying to restrict an attribute with type ID to a union of two types:

一般来说,两个类型的并集都是某种类型 T 的限制,其本身不被视为 T 的限制。这与 T 是 xs:ID 没有什么特别的关系。

我试过这个模式:

<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:simpleType name="u">
    <xs:union>
      <xs:simpleType>
        <xs:restriction base="xs:positiveInteger">
          <xs:enumeration value="1"/>
        </xs:restriction>
      </xs:simpleType>  
      <xs:simpleType>
        <xs:restriction base="xs:positiveInteger">
          <xs:enumeration value="2"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:union>
  </xs:simpleType>

  <xs:element name="e" type="xs:positiveInteger"/>

  <xs:element name="f" type="u" substitutionGroup="e"/>

</xs:schema>

和撒克逊报告:

Error on line 21 of test.xsd:
  Element f cannot be in the substitution group of e. Type u is not validly derived from type xs:positiveInteger

我想不出它不被视为有效限制的充分理由:可能只是规范中的疏忽。但就是这样。