在XSD中,如何定义具有相同名称的两个不同元素?

时间:2009-03-14 16:42:20

标签: xsd

我在制作xsd文件时遇到问题。我需要xsdxml文件的文件,如下所示:

<message type="login">
  <login nick="Ben" gameId="chess" desiredRole="simple "/>
</message>

或者像这样

<message type="error">
  Error message
</message>

意味着始终存在message标记,但它具有不同的属性type值,并且根据类型值,message标记内有不同的内容。我试过这样的事情:

<xsd:element name ='message' type='messageType'>
</xsd:element>

<xsd:complexType name='messageType'/>
  <xsd:complexType name='error'>
    <xsd:complexContent>
      <xsd:extension base='messageType'>
        <xsd:attribute name ='type' use='required'>
          <xsd:simpleType>
            <xsd:restriction base='xsd:string'>
              <xsd:enumeration value='error'/>
            </xsd:restriction>
          </xsd:simpleType>
        </xsd:attribute>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:complexType name='login'>
    <xsd:complexContent>
      <xsd:extension base='messageType'>
        <xsd:sequence>
          <xsd:element name='login'>
            <xsd:complexType>
              <xsd:attribute name='nick' type='xsd:string' use='required'>
              </xsd:attribute>
              <xsd:attribute name='gameId' type='xsd:string' use='required'>
              </xsd:attribute>
              <xsd:attribute name='desiredRole' type='xsd:string' use='required'>
              </xsd:attribute>
            </xsd:complexType>
          </xsd:element>
        </xsd:sequence>
        <xsd:attribute name ='type' use='required'>
          <xsd:simpleType>
            <xsd:restriction base='xsd:string'>
              <xsd:enumeration value='login'/>
            </xsd:restriction>
          </xsd:simpleType>
        </xsd:attribute>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

</xsd:schema>

但它不起作用(我收到一个错误,即未定义属性类型)。有人可以帮帮我吗?

2 个答案:

答案 0 :(得分:2)

怎么样

<message>
    <login />
</message>

<message>
    <error />
</message>

也就是说,不要使用type属性,并且在消息中始终有一个元素。

答案 1 :(得分:1)

XSD不允许您精确地执行您想要执行的操作,即根据属性值创建具有不同结构的元素。但是,如果您确实需要此元素具有这样的不同结构,则可以创建允许所有可能结构的元素定义。您只是不能让解析器自动验证它,以证明它只符合一个定义或另一个定义。无论如何都不在XSD范围内。

尝试这样的事情:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="message" type="messageType"/>

  <xsd:simpleType name="typeType">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="login"/>
      <xsd:enumeration value="error"/>
    </xsd:restriction>
  </xsd:simpleType>

  <xsd:element name="login">
    <xsd:complexType>
      <xsd:attribute name='nick'        type='xsd:string' use='required'/>
      <xsd:attribute name='gameId'      type='xsd:string' use='required'/>
      <xsd:attribute name='desiredRole' type='xsd:string' use='required'/>
    </xsd:complexType>
  </xsd:element>

  <xsd:complexType name='messageType'/>
    <xsd:sequence>
      <xsd:element ref="login" minOccurs="0" maxOccurs="1"/>
    </xsd:sequence>
    <xsd:attribute name="type" type="typeType" use="required"/>
  </xsd:complexType>
</xsd:schema>