[XML-DEV Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

Re: Schema Question


mapforce xsi type

John McCarthy wrote:

>Dan,
>
>In schema I think there is more than one possible way to accomplish this.  The one way that I have used is abstract comlex types 
>
John, the "idea" behind your schema is correct, but your schema 
implementation must be buggy.

You should have used "xs:restriction"  instead of "xs:extension", 
because you want to restrict the sequence of options (regexp notation)

data1?, data2?, data3?, data4?

to

data1, data2

along with the possible values of the attribute "mode", which is fixed. 
With extension, you try something like

data1?, data2?, data3?, data4?,data1, data2

which (if it was a valid schema) would make your schema too permissive: 
it allows things like <foo><data1/><data1/></foo>.

But since it is nondeterministic, it will be rejected.

Here is the corrected XML schema (for trying, download it from 
http://lamp.epfl.ch/~buraq/temp/fooS.xsd)

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
elementFormDefault="qualified" attributeFormDefault="unqualified">
  <xs:element name="foo" type="fooType">
  </xs:element>

  <xs:complexType name="fooType" abstract="true">
    <xs:sequence>
       <xs:element name="data1" type="xs:string" minOccurs="0" 
maxOccurs="1"/>
       <xs:element name="data2" type="xs:string" minOccurs="0" 
maxOccurs="1"/>
       <xs:element name="data3" type="xs:string" minOccurs="0" 
maxOccurs="1"/>
       <xs:element name="data4" type="xs:string" minOccurs="0" 
maxOccurs="1"/>
    </xs:sequence>
     <xs:attribute name="mode" type="xs:string"/>
   </xs:complexType>

  <xs:complexType name="fooOne" >
     <xs:complexContent>
       <xs:restriction base="fooType">
            <xs:sequence>
               <xs:element name="data1" type="xs:string" minOccurs="1" 
maxOccurs="1"/>
               <xs:element name="data2" type="xs:string"  minOccurs="1" 
maxOccurs="1"/>
            </xs:sequence>
            <xs:attribute name="mode" type="xs:string" fixed="one"/>
       </xs:restriction>
     </xs:complexContent>
  </xs:complexType>


  <xs:complexType name="fooTwo" >
     <xs:complexContent>
       <xs:restriction base="fooType">
            <xs:sequence>
               <xs:element name="data3" type="xs:string" minOccurs="1" 
maxOccurs="1"/>
               <xs:element name="data4" type="xs:string" minOccurs="1" 
maxOccurs="1"/>
            </xs:sequence>
            <xs:attribute name="mode" type="xs:string" fixed="two"/>
       </xs:restriction>
     </xs:complexContent>
  </xs:complexType>
</xs:schema>

I tried to validate the schema itself, and the instances using 
http://apps.gotdotnet.com/xmltools/xsdvalidator/Default.aspx, it works.

To do this example with derivation by extension, the base type should be 
empty, but I don't think you can at the same time extend the elements 
(add data1,data2 to the empty sequence) and at the same time restrict 
the value of the mode attribute, so restriction seems like the only way)

Thanks for posting this idea.

cheers,
Burak

>and type substitution.  The schema might look something like this:
>
><?xml version="1.0" encoding="UTF-8"?>
><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
>  <xs:element name="foo" type="fooType">
>  </xs:element>
>
>  <xs:complexType name="fooType" abstract="true"/>
>       <xs:element name="data1" type="xs:string" minOccurs="0" maxOccurs="1"/>
>       <xs:element name="data2" type="xs:string" minOccurs="0" maxOccurs="1"/>
>       <xs:element name="data3" type="xs:string" minOccurs="0" maxOccurs="1"/>
>       <xs:element name="data4" type="xs:string" minOccurs="0" maxOccurs="1"/>
>     <xs:attribute name="mode" type="xs:string"/>
>  <xs:complexType name="fooOne" >
>
>     <xs:complexContent>
>       <xs:extension base="fooType">
>            <xs:sequence>
>               <xs:element name="data1" type="xs:string" minOccurs="1" maxOccurs="1"/>
>               <xs:element name="data2" type="xs:string"  minOccurs="1" maxOccurs="1"/>
>            </xs:sequence>
>            <xs:attribute name="mode" type="xs:string" fixed="one"/>
>       </xs:extension>
>     </xs:complexContent>
>  </xs:complexType>
>
>
>  <xs:complexType name="fooTwo" >
>     <xs:complexContent>
>       <xs:extension base="fooType">
>            <xs:sequence>
>               <xs:element name="data3" type="xs:string" minOccurs="1" maxOccurs="1"/>
>               <xs:element name="data4" type="xs:string" minOccurs="1" maxOccurs="1"/>
>            </xs:sequence>
>            <xs:attribute name="mode" type="xs:string" fixed="two"/>
>       </xs:extension>
>     </xs:complexContent>
>  </xs:complexType>
></xs:schema>
>
>and both of the following instance documents validate.
>
>
><foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="foo.xsd" xsi:type="fooOne" mode="one">
>  <data1>abc</data1>
>  <data2>xyz</data2>
></foo>
>
><foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="foo.xsd" xsi:type="fooTwo" mode="two">
>  <data3>abc</data3>
>  <data4>xyz</data4>
></foo>
>
>Regards
>John McCarthy
>
>
>
>                                                                                                                                                   
>                      Dan White                                                                                                                    
>                      <ygor@c...        To:       xml-dev@l...                                                                     
>                      >                        cc:                                                                                                 
>                                               Subject:   Schema Question                                                                 
>                      07/07/04 11:32 AM                                                                                                            
>                                                                                                                                                   
>                                                                                                                                                   
>
>
>
>
>
>I need a pointer or two about creating a schema.
>
>I have a situation where the incoming XML will have an element/attribute
>specifying one of four enumerated choices.  Depending on the value of that
>choice, the elements that follow will be different.
>
>Like this:
><foo>
>  <mode>one</mode>
>  <data1>aaa</data1>
>  <data2>bbb</data2>
></foo
>
><foo>
>  <mode>two</mode>
>  <data3>ccc</data3>
>  <data4>ddd</data4>
></foo>
>
>or
><foo mode="one">
>  <data1>aaa</data1>
>  <data2>bbb</data2>
></foo
>
><foo mode="two">
>  <data3>ccc</data3>
>  <data4>ddd</data4>
></foo>
>
>How does one set up the schema to validate the appropriate sequence of
>elements based on the value of the "controlling" element/attribute ?
>
>Thanks in advance.
>  
>


PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
 

Stylus Studio has published XML-DEV in RSS and ATOM formats, enabling users to easily subcribe to the list from their preferred news reader application.


Stylus Studio Sponsored Links are added links designed to provide related and additional information to the visitors of this website. they were not included by the author in the initial post. To view the content without the Sponsor Links please click here.

Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.