Fred Smith wrote:
Any suggestions or tips to the questions below I have been wrestling with
would be most welcome:
I have an example XSD file I have been experimenting with. Suppose a
user can select from 1 to 4 checkboxes on a web form:
Select your favorite sport(s):
(checkbox) baseball
(checkbox) football
(checkbox) soccer
(checkbox) golf
Futhermore, suppose a user selects all the above sports:
The xml generated from the program that reads the form variables would be:
<sport>baseball \n\football\n\s occer\n\golf</sport>
Questions:
1. what is the most effective schema statement to handle the
possiblity of the user selecting either baseball or baseball and football
or baseball, football, soccer etc..? In other words, any permutation of
checkboxes.
I would think you would use the logical or operator (|).
I was thinking something like below, but I am getting errors such as
"Datatype error: In element 'sport': Value ........ does not match regular
expression facet ............... .
<xsd:simpleTy pe name="sport">
<xsd:restrictio n base="xsd:strin g">
<xsd:pattern value="baseball \\n|\\nfootball \\n|\\nsoccer\\ n|golf"/>
If there are certain fixed values possible a list of an enumerated type
could help:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
<xs:complexType >
<xs:sequence>
<xs:element ref="sport" maxOccurs="unbo unded" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:simpleTyp e name="sport">
<xs:restricti on base="xs:string ">
<xs:enumerati on value="baseball " />
<xs:enumerati on value="football " />
<xs:enumerati on value="soccer" />
<xs:enumerati on value="golf" />
</xs:restriction>
</xs:simpleType>
<xs:element name="sport">
<xs:simpleTyp e>
<xs:list itemType="sport " />
</xs:simpleType>
</xs:element>
</xs:schema>
That allows values like
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:xsi="http ://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespace SchemaLocation= "test20040205Xs d.xml">
<sport>baseba ll football soccer golf</sport>
<sport>baseba ll
football
soccer
golf
</sport>
<sport>soccer football</sport>
</root>
meaning the order is not restricted to what you have.
If you want to use a regular expression to restrict the type I think the
following helps:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
<xs:complexType >
<xs:sequence>
<xs:element ref="sport" maxOccurs="unbo unded" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="sport">
<xs:simpleTyp e>
<xs:restricti on base="xs:string ">
<xs:pattern
value="(basebal l\s*)?(football \s*)?(soccer\s* )?(golf)?" />
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:schema>
which restricts the content of a <sport> element to being zero or one
occurrence of baseball plus some whitespace and zero or one occurence of
football plus some whitespace and zero or one occurence of soccer plus
some whitespace plus zero or one occurence of golf.
--
Martin Honnen
http://JavaScript.FAQTs.com/