XSD元素受属性限制

时间:2014-09-14 10:32:50

标签: attributes xsd element restriction

嗨我有架构问题,我尝试使用如下属性创建受限元素:

    <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">

      <xs:simpleType name="turn">
        <xs:restriction base="xs:unsignedShort">
          <xs:minInclusive value="0"/>
          <xs:maxInclusive value="360"/>
        </xs:restriction>
      </xs:simpleType>

      <xs:element name = "TURN_LEFT" type="turn" nillable="false">
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="xs:unsignedShort">
              <xs:attribute type="xs:string" name="description" use="optional"/>
            </xs:extension>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>

      <xs:element name = "FORWARD" nillable="false">
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="xs:unsignedShort">
              <xs:attribute type="xs:string" name="description" use="optional"/>
            </xs:extension>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>

    </xs:schema>

TURN_LEFT的开放标记的错误描述&#34; type属性不能与simpleType或complexType&#34;的元素一起出现。

如何使用属性限制?

2 个答案:

答案 0 :(得分:2)

出现元素&#34;转&#34;由TURN_LEFT在架构中使用。 但是,对于不需要的同一元素有两个显式声明。 您可以尝试以下更正:

<xs:element name = "TURN_LEFT" type="turn" nillable="false">
    <!-- Commented TURN_LEFT declaration -->
    <!--<xs:complexType>
        <xs:simpleContent>
            <xs:extension base="xs:unsignedShort">
                <xs:attribute type="xs:string" name="description" use="optional"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>-->
</xs:element>

<xs:simpleType name="turn">
    <xs:restriction base="xs:unsignedShort">
        <xs:minInclusive value="0"/>
        <xs:maxInclusive value="360"/>
    </xs:restriction>
</xs:simpleType>



<xs:element name = "FORWARD" nillable="false">
    <xs:complexType>
        <xs:simpleContent>
            <xs:extension base="xs:unsignedShort">
                <xs:attribute type="xs:string" name="description" use="optional"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
</xs:element>

答案 1 :(得分:1)

您不能在元素中包含类型属性和 complexType (或simpleType)子元素。

TURN_LEFT可以是 turn 类型的元素(属性 type =“turn”),或者TURN_LEFT应该是元素内定义的complexType类型的元素。 / p>

看看这个简单的例子:

<xs:element name="myElement" type="xs:boolean">
    <xs:restriction base="float">
    </xs:restriction>
</xs:element>

如果您定义一个类似于XML Schema的元素,那么它是不正确的,因为它是不明确的(如果您已经定义了两种类型的类型,我们如何知道 myElement 它的布尔类型或浮点类型?)

我认为这就是你想要做的事情:

  <xs:element name = "TURN_LEFT" nillable="false">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="turn">
          <xs:attribute type="xs:string" name="description" use="optional"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>

基础(您正在扩展的类型)是类型。 这将验证此元素:

<TURN_LEFT description="cool">12</TURN_LEFT>