OASIS Mailing List ArchivesView the OASIS mailing list archive below
or browse/search using MarkMail.

 


Help: OASIS Mailing Lists Help | MarkMail Help

 


 

   Re: [xml-dev] Schema Question

[ Lists Home | Date Index | Thread Index ]


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@comcast.net        To:       xml-dev@lists.xml.org                                                                     
>                      >                        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.
>  
>





 

News | XML in Industry | Calendar | XML Registry
Marketplace | Resources | MyXML.org | Sponsors | Privacy Statement

Copyright 2001 XML.org. This site is hosted by OASIS