在哪里声明一个simpleType,以便它可以在同一个XSD中的几个元素中使用?

时间:2012-10-31 02:35:16

标签: xml xsd simpletype

现在我有一个XSD文件(例如FOO_SCHEMA.xsd),如下所示:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="FOO">
        <xs:annotation>
            <xs:documentation>Comment</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element name="BAR1" type="xs:string" />
                <xs:element name="BAR2" type="xs:string" />
                <xs:element name="BAR3" type="xs:string" />
                <xs:element name="BAR4" type="xs:string" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

我想修改两个元素(比如BAR1和BAR2)来使用一次。我知道如何将它用于其中一个,

<xs:element name="BAR1">
   <xs:simpleType>
       <!-- my type definition here -->
   </xs:simpleType>
</xs:element>

但是我想在两个(也许更多)元素中使用它,而且我不确定如果不在任何地方复制相同的简单类型定义我怎么能这样做。从谷歌搜索,似乎我需要声明一个名称

的类型

           

但我不知道在哪里发表这个声明。我尝试将它与xs:complexType和其他几个级别放在同一级别,但它被架构验证器拒绝。知道在哪里发表这个声明吗?  有什么想法吗?

2 个答案:

答案 0 :(得分:5)

XSD文件中的所有可引用组件必须直接放在xs:schema元素下。换句话说,您的全局简单类型声明必须是FOO元素的兄弟。

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="FOO">
        <xs:annotation>
            <xs:documentation>Comment</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element name="BAR1" type="BAR" />
                <xs:element name="BAR2" type="BAR" />
                <xs:element name="BAR3" type="xs:string" />
                <xs:element name="BAR4" type="xs:string" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:simpleType name="BAR">
        <xs:restriction base="xs:string">
            <xs:pattern value="BAR"/>
        </xs:restriction>
    </xs:simpleType>
</xs:schema>

答案 1 :(得分:1)

定义全局并使用type属性指定类型。

  <xs:simpleType name="test">
    <xs:annotation>
      <xs:documentation>
        Defines a string that is between 1 and 300 chars
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <xs:minLength value="1" />
      <xs:maxLength value="300" />
    </xs:restriction>
  </xs:simpleType>

  <xs:element name="foo">
    <xs:complexType>
      <xs:attribute type="test" name="bar"/>
    </xs:complexType>   
  </xs:element>