3

现在我有一个看起来像这样的 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 和其他几个级别相同的级别,但它被架构验证器拒绝。知道把这个声明放在哪里吗?任何的想法?

4

2 回答 2

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>
于 2012-10-31T02:42:09.890 回答
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>
于 2012-10-31T02:46:06.660 回答