Home. 
.

transparent

transparent

transparent

Altova Mailing List Archives


Re: [xml-dev] Schema Question

From: Burak Emir <Burak.Emir@----.-->
To: John McCarthy <john.mccarthy@--.--->
Date: 7/8/2004 8:06:00 AM
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:  [xml-dev] 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.
>  
>


transparent
Print
Mail
Like It
Disclaimer
.

These Archives are provided for informational purposes only and have been generated directly from the Altova mailing list archive system and are comprised of the lists set forth on www.altova.com/list/index.html. Therefore, Altova does not warrant or guarantee the accuracy, reliability, completeness, usefulness, non-infringement of intellectual property rights, or quality of any content on the Altova Mailing List Archive(s), regardless of who originates that content. You expressly understand and agree that you bear all risks associated with using or relying on that content. Altova will not be liable or responsible in any way for any content posted including, but not limited to, any errors or omissions in content, or for any losses or damage of any kind incurred as a result of the use of or reliance on any content. This disclaimer and limitation on liability is in addition to the disclaimers and limitations contained in the Website Terms of Use and elsewhere on the site.

.
.

transparent

transparent