在Xml Schema中,向简单类型添加属性或向复杂类型添加限制

69
问题如下:
我有以下的XML片段:
<time format="minutes">11:60</time>

问题在于我无法同时添加属性和限制。属性格式只能包含分钟、小时和秒的值。时间有一个限制模式\d{2}:\d{2}

<xs:element name="time" type="timeType"/>
...
<xs:simpleType name="formatType">
    <xs:restriction base="xs:string">
        <xs:enumeration value="minutes"/>
        <xs:enumeration value="hours"/>
        <xs:enumeration value="seconds"/>
    </xs:restriction>
</xs:simpleType>
<xs:complexType name="timeType">
    <xs:attribute name="format">
        <xs:simpleType>
            <xs:restriction base="formatType"/>
        </xs:simpleType>
    </xs:attribute>
</xs:complexType>

如果我创建一个复杂类型的timeType,我可以添加属性,但无法添加限制;而如果我创建一个简单类型,我可以添加限制,但无法添加属性。有没有办法解决这个问题?这不是一个很奇怪的限制,对吗?

2个回答

127

要添加属性,您必须通过扩展进行派生;要添加facets,您必须通过限制进行派生。因此,对于元素的子内容,必须分两步完成。属性可以在行内定义:

<xsd:simpleType name="timeValueType">
  <xsd:restriction base="xsd:token">
    <xsd:pattern value="\d{2}:\d{2}"/>
  </xsd:restriction>
</xsd:simpleType>

<xsd:complexType name="timeType">
  <xsd:simpleContent>
    <xsd:extension base="timeValueType">
      <xsd:attribute name="format">
        <xsd:simpleType>
          <xsd:restriction base="xsd:token">
            <xsd:enumeration value="seconds"/>
            <xsd:enumeration value="minutes"/>
            <xsd:enumeration value="hours"/>
          </xsd:restriction>
        </xsd:simpleType>
      </xsd:attribute>
    </xsd:extension>
  </xsd:simpleContent>
</xsd:complexType>

4

我想提供一个例子,更详细地解释在添加属性时混合继承类型和限制所需的实际操作。

这里是您定义继承类型的位置(在我的情况下,它是基于xs:string的,并应用了1024个字段长度的限制)。由于您将添加一个“属性”到您的字段中,因此不能将此作为您字段的标准类型。

  <xs:simpleType name="string1024Type">
    <xs:restriction base="xs:string">
      <xs:maxLength value="1024"/>
    </xs:restriction>
  </xs:simpleType>

这是定义元素的地方,基于您的私有类型(在我的情况下是“string1024Type”),并添加必要的属性:
<xs:element maxOccurs="unbounded" name="event">
  <xs:complexType>
    <xs:simpleContent>
      <xs:extension base="string1024Type">
        <xs:attribute default="list" name="node" type="xs:string"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
</xs:element>

这两个块可以完全分开放置在模式的不同位置,但是重要的一点是 - 不能在同一个元素定义中混合使用继承和属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接