[
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.
>
>
|