XSD的分组,选择,全部或序列

时间:2014-11-21 13:40:27

标签: xml xsd

我为元素定义了此类型"标记",标记可以是图片引用格式

<complexType name="Tag">
        <choice minOccurs="0" maxOccurs="unbounded">
            <element name="quote" type="rel:Quote" maxOccurs="1"
                minOccurs="0">
            </element>
            <element name="image" type="rel:Image" minOccurs="0"
                maxOccurs="1">
            </element>
            <element name="format" type="rel:Format" minOccurs="0"
                maxOccurs="1">
            </element>
        </choice>
</complexType>

我如何使用例如

<rel:image></rel:image>

而不是

 <rel:tag><rel:image></rel:image></rel:tag>

2 个答案:

答案 0 :(得分:1)

如果Tag是元素tag的类型,那么您定义它的方式,tag元素可以包含quote,{{1}的序列},或image个孩子。

如果您希望format代替image,则应将tag元素定义为替换组的成员,其中image为其头部

答案 1 :(得分:1)

XML Schema具有替代组的构造,允许某些元素替换其他元素。这可能就是你想要的。

例如,您可以定义tag类型的元素Tag

<xs:element name="tag" type="Tag"/>

并在某处使用它:

<xs:complexType name="Tags">
    <xs:sequence>
        <xs:element ref="tag"/>
    </xs:sequence>
</xs:complexType>

现在,您可以定义元素quoteimageformat,以便能够替换tag

<xs:element name="quote" type="Quote" substitutionGroup="tag"/>
<xs:element name="image" type="Image" substitutionGroup="tag"/>
<xs:element name="format" type="Format" substitutionGroup="tag"/>

QuoteImageFormat必须来自Tag类型。

现在,在使用tag元素的每个地方(每个引用),它都可以被quoteimageformat元素替换。

Geography Markup Language(地理标记语言)使用此模式的模式示例,这里是指向过时(但简洁)版本2.1.2的链接。

架构定义了一个抽象元素_Geometry

<element name="_Geometry" type="gml:AbstractGeometryType" abstract="true"/>

<complexType name="AbstractGeometryType" abstract="true">
    <annotation>
        <documentation>
    All geometry elements are derived from this abstract supertype; 
    a geometry element may have an identifying attribute (gid). 
    It may be associated with a spatial reference system.
  </documentation>
    </annotation>
    <complexContent>
        <restriction base="anyType">
            <attribute name="gid" type="ID" use="optional"/>
            <attribute name="srsName" type="anyURI" use="optional"/>
        </restriction>
    </complexContent>
</complexType>

然后定义一个可以替换Polygon的元素_Geometry

<element name="Polygon" type="gml:PolygonType" substitutionGroup="gml:_Geometry"/>

<complexType name="PolygonType">
    <annotation>
        <documentation>
    A Polygon is defined by an outer boundary and zero or more inner 
    boundaries which are in turn defined by LinearRings.
  </documentation>
    </annotation>
    <complexContent>
        <extension base="gml:AbstractGeometryType">
            <sequence>
                <element ref="gml:outerBoundaryIs"/>
                <element ref="gml:innerBoundaryIs" minOccurs="0" maxOccurs="unbounded"/>
            </sequence>
        </extension>
    </complexContent>
</complexType>

现在您可以使用Polygon以及引用_Geometry的其他元素:

<complexType name="GeometryAssociationType">
    <annotation>
        <documentation>
    An instance of this type (e.g. a geometryMember) can either 
    enclose or point to a primitive geometry element. When serving 
    as a simple link that references a remote geometry instance, 
    the value of the gml:remoteSchema attribute can be used to 
    locate a schema fragment that constrains the target instance.
  </documentation>
    </annotation>
    <sequence minOccurs="0">
        <element ref="gml:_Geometry"/>
    </sequence>
    <attributeGroup ref="xlink:simpleAttrs"/>
    <attribute ref="gml:remoteSchema" use="optional"/>
    <!-- <attributeGroup ref="gml:AssociationAttributeGroup"/> -->
</complexType>