如何合并 XSD 中属性的枚举值?

How to combined enum values for an attribute in XSD?

我想创建一个采用不同组合值的属性 (gravity_layout)(例如:bottom|right) 我怎样才能使这个属性? 我写了这个:

   <xs:attribute name='layout_gravity'>
    <xs:simpleType>
      <xs:union memberTypes='xs:string'>
        <xs:simpleType>
          <xs:restriction base='xs:NMTOKEN'>
            <xs:enumeration value='bottom' />
            <xs:enumeration value='center' />
            <xs:enumeration value='center_horizontal' />
            <xs:enumeration value='center_vertical' />
            <xs:enumeration value='clip_horizontal' />
            <xs:enumeration value='clip_vertical' />
            <xs:enumeration value='fill' />
            <xs:enumeration value='fill_horizontal' />
            <xs:enumeration value='fill_vertical' />
            <xs:enumeration value='left' />
            <xs:enumeration value='right' />
            <xs:enumeration value='top' />
          </xs:restriction>
        </xs:simpleType>
      </xs:union>
    </xs:simpleType>
  </xs:attribute>

我可以只为它定义一个值,例如rightbottom,但是如果我写right|bottom,就会出错。

你可以

  1. 使用 XSD v1.1 断言(在 XSD v1.0 中不可用) 并尝试找出一个聪明的 XPath 来 验证由 | 分隔的合法值的微语言 符号,

  2. 修复您的 XML 设计以使用单独的 source 元素 layout_gravity 而不是将多个值塞进一个 @layout_gratity 属性:

    <layout_gravity>
      <source>bottom</source>
      <source>right</source>
      <!-- ... -->
    </layout_gravity>
    

我推荐方法 #2 因为

  • XSD(v1.1或v1.0)将能够自然地表示你的约束,并且
  • 使用您的 XML 的程序将能够利用 XML 解析器 而不是必须微解析复合值塞进一个单一的 属性。