xsd: How to extend a type with an unordered list of elements

后端 未结 2 448
天涯浪人
天涯浪人 2021-01-17 22:28

This is a part of my xml schema


    
        
              


        
相关标签:
2条回答
  • 2021-01-17 23:02

    One-and-half year after this question and the accepted answer were posted, XSD 1.1 was published. In this version it is possible to specify what the OP asked for because a number of restriction on xs:all were lifted. One of them is that it is now possible to extend an xs:all.

    Using XSD 1.1 you can specify the following:

    <xs:complexType name="Person" abstract="true">
        <xs:all>
            <xs:element name="name" type="xs:string" minOccurs="0" />
            <xs:element name="phone" type="xs:string" minOccurs="0" />
        </xs:all>
    </xs:complexType>
    <xs:complexType name="Friend">
        <xs:complexContent>
            <xs:extension base="Person">
                <xs:all>
                    <xs:element name="address" type="xs:string" minOccurs="0" />
                </xs:all>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="Coworker">
        <xs:complexContent>
            <xs:extension base="Person">
                <xs:all>
                    <xs:element name="office" type="xs:string" minOccurs="0" />
                </xs:all>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    

    This defines the following types:

    • Person: an abstract type with optional unordered name and phone elements;
    • Friend: extends Person adding an optional address element to the list of unordered elements;
    • Coworker: extends Coworker adding an optional office element to the list of unordered elements.

    Note that this solution does not work for every XML processor: even though 8 years have passed since the publication of XSD 1.1, a lot of processors still only support XSD 1.0.

    0 讨论(0)
  • 2021-01-17 23:15

    You have to limit yourself a little bit, some of the things you are trying to do are not possible in XML Schema.

    Suppose you introduce a complex type called Person to be a super-type of Friend and Coworker. Here are your options:

    1. Replace xs:all with xs:sequence, remove name and phone from the sub-types, add to the super-type, and add inheritance. Your elements now have to be ordered, but you can make them individually optional. It is illegal to use xs:all in type hierarchies in XML Schema, because the processor cannot tell where the parent content model stops and the child content model starts.
    2. Replace xs:all with <xs:choice maxOccurs="unbounded"> in both types, and add your inheritance. Then your elements become unordered again, but they may repeat.

    So in conclusion: given your type names up there, I would guess that your requirements will not be exactly met. I would go for the first option: insisting on arbitrary element order is often not as useful as it seems.

    0 讨论(0)
提交回复
热议问题