[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: XML Schema question: A <xs:choice> equivalent for attributes?
- From: Eddie Robertsson <firstname.lastname@example.org>
- To: "Spoonauer, Michael" <Michael.Spoonauer@FMR.COM>
- Date: Tue, 03 Jul 2001 11:22:54 +1000
"Spoonauer, Michael" wrote:
> I wish to create an XML document in which one of its elements must be
> defined with one of two known attributes, but not both.
> For example, I would like to define a "socketHandler" element as follows:
> <xs:element name="socketHandler">
> <xs:attribute name="hostName" type="xs:string"/>
> <xs:attribute name="hostAddress" type="xs:string"/>
> <xs:attribute name="port" type="xs:int" use="required"/>
> but I only want a user to be able to define either a hostName attribute
> (e.g., hostName="<servername>") or a hostAddress (e.g.,
> hostAddress="<IP_address>") attribute, but not both. It appears that the
> <xs:choice> construct accomplishes this for elements. Is there a functional
> equivalent for attributes, or is there a better way to approach this?
Unfortunately you can't do this with W3C XML Schema. As I see it you have two
1) Change to a different schema dialect (I think RELAX-NG support this
2) Express you co-constraint using an embedded schematron rule
In your example the latter could be expressed as the following Schematron rule
on your socketHandler element:
> On a <tag> element, if there is the attribute "attr", the
child element <attr> must be prohibited and vice versa.</sch:report>
<xs:attribute name="hostName" type="xs:string"/>
<xs:attribute name="hostAddress" type="xs:string"/>
<xs:attribute name="port" type="xs:int" use="required"/>
These constraints can be validated with the new Schematron Validator from
Topologi. The tool is free and can be downloaded from www.topologi.com.
> If there's a more appropriate forum for this type of question, just let me
xmlschema-dev is probably a better choice for schema questions.