- From: Francis Norton <francis@redrice.com>
- Date: Thu, 31 Jul 2003 16:13:44 +0100
- To: Camilla Brenchley <cbrenchley@transhotel.com>
- CC: xmlschema-dev@w3.org
Hi Camilla,
Camilla Brenchley wrote:
>I need to write an xml schema that checks that at least one of "Location"'s
>four children (country, area, city, hotel) is present. I don't care which
>one as long as one of them is there. The order of the child elements doesn't
>matter.
>
If you are willing to impose order on the child elements you could do this:
---
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:element name="Location">
<xs:complexType>
<xs:choice>
<xs:sequence>
<xs:element ref="country"/>
<xs:element ref="area" minOccurs="0"/>
<xs:element ref="city" minOccurs="0"/>
<xs:element ref="hotel" minOccurs="0"/>
</xs:sequence>
<xs:sequence>
<xs:element ref="area"/>
<xs:element ref="city" minOccurs="0"/>
<xs:element ref="hotel" minOccurs="0"/>
</xs:sequence>
<xs:sequence>
<xs:element ref="city"/>
<xs:element ref="hotel" minOccurs="0"/>
</xs:sequence>
<xs:sequence>
<xs:element ref="hotel"/>
</xs:sequence>
</xs:choice>
</xs:complexType>
</xs:element>
<xs:element name="area" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
<xs:element name="hotel" type="xs:string"/>
</xs:schema>
---
If you really need them to be available in any order you face a bit of a
complexity explosion. Either that, or use schematron[1], which can be
embedded in your schema and processed in any environment that supports XSLT.
Francis.
[1] http://www.ascc.net/xml/resource/schematron/schematron.html
--
"Never mind manoeuvre, go straight at 'em." - Admiral Horatio Nelson
Received on Thursday, 31 July 2003 11:15:54 UTC