代码之家  ›  专栏  ›  技术社区  ›  Ikke

在XML架构中将属性添加到simpleType或限制添加到complexType

  •  62
  • Ikke  · 技术社区  · 16 年前

    问题如下:

    我有以下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>
    

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

    2 回复  |  直到 8 年前
        1
  •  115
  •   Richard    16 年前

    要添加属性,必须通过扩展派生,要添加方面,必须通过限制派生。因此,对于元素的子内容,这必须分两步完成。可以以内联方式定义该属性:

    <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>
    
        2
  •  2
  •   Oleg Kokorin    8 年前

    我想提出一个更详细的示例,解释在添加属性时,将继承类型和限制混合在一起实际需要什么。

    这是您定义继承类型的地方(在我的例子中,它是基于xs:string的类型,应用了字段lengt1024限制)。您不能将此作为字段的标准类型,因为您也要向字段添加一个“属性”。

      <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>
    

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