如何在XMLSchema中将属性添加到简单类型或限制到复杂类型?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (52)

问题如下:

我有以下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,我可以添加一个属性,但不能添加限制,如果我创建一个简单的类型,我可以添加限制,但不能添加属性。

提问于
用户回答回答于

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

<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>
用户回答回答于

我想给出我的例子,并详细解释一下在添加属性的同时将继承类型与限制混为一谈的实际需要。

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

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

这是根据私有类型(在我的示例中是“string 1024Type”)和附加的必要属性定义元素的位置:

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

这两个块可能位于模式中完全不同的位置。重要的是再次遵循--不能将继承和属性混合在同一个元素定义中。

扫码关注云+社区