Advice on ways to extend a type using XSD

Discussion in 'XML' started by Charles Fineman, Feb 24, 2004.

  1. Say i've got a type that appears in a request... say it represents a
    shipment. I want it to contain things like from and to address elements
    as well as a sequence of the pieces being shipped.

    Say the operation is supposed to calculate the cost to ship each piece.
    I would like the response type to look just like the request type but
    with a price element under each of the item types. For example:

    Request:
    <shipment>
    <from/>
    <to/>
    <pieces>
    <piece>
    <weight>100</weight>
    </piece>
    <piece>
    <weight>5</weight>
    </piece>
    </pieces>
    </shipment>

    Response:
    <shipment>
    <from/>
    <to/>
    <pieces>
    <piece>
    <weight>100</weight>
    <cost>10.00</cost>
    </piece>
    <piece>
    <weight>5</weight>
    <cost>5.00</cost>
    </piece>
    </pieces>
    </shipment>

    It would be great if I could easily extend the request type to turn it
    into the response type but I'm not sure there is an easy way to do that.

    Any thoughts?
    Charles Fineman, Feb 24, 2004
    #1
    1. Advertising

  2. Charles Fineman wrote:

    > Say i've got a type that appears in a request... say it represents a
    > shipment. I want it to contain things like from and to address elements
    > as well as a sequence of the pieces being shipped.
    >
    > Say the operation is supposed to calculate the cost to ship each piece.
    > I would like the response type to look just like the request type but
    > with a price element under each of the item types. For example:
    >
    > Request:
    > <shipment>
    > <from/>
    > <to/>
    > <pieces>
    > <piece>
    > <weight>100</weight>
    > </piece>
    > <piece>
    > <weight>5</weight>
    > </piece>
    > </pieces>
    > </shipment>
    >
    > Response:
    > <shipment>
    > <from/>
    > <to/>
    > <pieces>
    > <piece>
    > <weight>100</weight>
    > <cost>10.00</cost>
    > </piece>
    > <piece>
    > <weight>5</weight>
    > <cost>5.00</cost>
    > </piece>
    > </pieces>
    > </shipment>
    >
    > It would be great if I could easily extend the request type to turn it
    > into the response type but I'm not sure there is an easy way to do that.


    One possible way is to have an element with minOccurs="0":
    <xs:element name="pieces">
    <xs:complexType>
    <xs:sequence>
    <xs:element name="piece" maxOccurs="unbounded">
    <xs:complexType>
    <xs:sequence>
    <xs:element name="weight" type="xs:double" />
    <xs:element name="cost" minOccurs="0" maxOccurs="1"
    type="xs:double" />
    </xs:sequence>
    </xs:complexType>
    </xs:element>
    </xs:sequence>
    </xs:complexType>
    </xs:element>

    That way you can have <weight> and <cost> children or only a <weight> child.

    --

    Martin Honnen
    http://JavaScript.FAQTs.com/
    Martin Honnen, Feb 25, 2004
    #2
    1. Advertising

  3. Agreed, but I'm hoping to keep the typing as "strong" as possible. It's
    clear that I can extend the immediate children of the type (using
    xs:extension) but it does not look like I can extend, say, the
    grandchildren.

    I would rather not define a ton of global types just for the purposes of
    extension (is there a way to create global types that are local to the
    file?). I could also use groups and just define a completely separate
    complex type (but that's effectively the same as using extension in this
    case I believe).

    Martin Honnen wrote:

    >
    >
    > Charles Fineman wrote:
    >
    >> Say i've got a type that appears in a request... say it represents a
    >> shipment. I want it to contain things like from and to address
    >> elements as well as a sequence of the pieces being shipped.
    >>
    >> Say the operation is supposed to calculate the cost to ship each
    >> piece. I would like the response type to look just like the request
    >> type but
    >> with a price element under each of the item types. For example:
    >>
    >> .... EDITED OUT ....
    >>
    >> It would be great if I could easily extend the request type to turn it
    >> into the response type but I'm not sure there is an easy way to do that.

    >
    >
    > One possible way is to have an element with minOccurs="0":
    > <xs:element name="pieces">
    > <xs:complexType>
    > <xs:sequence>
    > <xs:element name="piece" maxOccurs="unbounded">
    > <xs:complexType>
    > <xs:sequence>
    > <xs:element name="weight" type="xs:double" />
    > <xs:element name="cost" minOccurs="0" maxOccurs="1"
    > type="xs:double" />
    > </xs:sequence>
    > </xs:complexType>
    > </xs:element>
    > </xs:sequence>
    > </xs:complexType>
    > </xs:element>
    >
    > That way you can have <weight> and <cost> children or only a <weight>
    > child.
    >
    Charles Fineman, Feb 25, 2004
    #3
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Markus
    Replies:
    1
    Views:
    1,079
    Markus
    Nov 22, 2005
  2. Rick Razzano

    XSD document for XSD defintion

    Rick Razzano, Sep 26, 2003, in forum: XML
    Replies:
    1
    Views:
    468
    C. M. Sperberg-McQueen
    Sep 26, 2003
  3. Replies:
    1
    Views:
    656
    Henry S. Thompson
    Dec 21, 2005
  4. Replies:
    1
    Views:
    1,366
    Zafar Abbas
    Dec 30, 2005
  5. Bert Heymans
    Replies:
    2
    Views:
    242
    Pablo Torres
    Aug 21, 2007
Loading...

Share This Page