- From: Cams Ismael <Ismael.Cams@siemens.com>
- Date: Thu, 20 Mar 2003 10:29:17 +0100
- To: "'Jeni Tennison'" <jeni@jenitennison.com>
- Cc: "'xmlschema-dev@w3.org'" <xmlschema-dev@w3.org>
Hello Jeni, thanks for the help. > A. Define a moduleType type, and two derivations thereof -- > masterAgentModule and proxyAgentModule. Then use xsi:type on > individual <module> elements to indicate whether they hold > <masterAgent> or <proxyAgent> elements. How can I restrict that there is just one element of type masterAgentModule available and 0 or more of type proxyAgentModule. I have defined next: <xsd:complexType name="moduleType"> <xsd:sequence> ... </xsd:sequence> </xsd:complexType> <xsd:complexType name="masterAgentModule"> <xsd:complexContent> <xsd:extension base="moduleType"/> <xsd:sequence> ... </xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType> <xsd:complexType name="proxyAgentModule"> <xsd:complexContent> <xsd:extension base="moduleType"/> <xsd:sequence> ... </xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType> <xsd:element name="node"> <xsd:complexType> <xsd:sequence> ??? </xsd:sequence> </xsd:complexType> </xsd:element> Kind regards, Ismaël -----Original Message----- From: Jeni Tennison [mailto:jeni@jenitennison.com] Sent: woensdag 19 maart 2003 17:27 To: Cams Ismael Cc: xmlschema-dev@w3.org Subject: Re: Defining unique pair of elements Hi Ismaël, > The combination module - masteragent must be present just one time. > The combination module - proxagent may be available 0 or more times. > > How can I define this with xsd ? You can't in any non-hacky way because XSD doesn't let two elements with the same name in the same context have different types (content models). You could do the following: 1. Add a fixed attribute to <masteragent> elements that always takes the value 'master', then define an identity constraint that says every <masteragent> element must have a unique value for that attribute. This will ensure that the <masteragent> element can only appear once if it appears at all, but doesn't ensure that the <masteragent> element does appear somewhere. 2. Add a Schematron constraint, something like: <sch:rule context="modules"> <sch:assert test="count(module/masteragent) = 1"> The masteragent element must appear once and only once. </sch:assert> </sch:rule> to test the constraint. 3. Switch to using RELAX NG, where you can just do: <element name="modules"> <interleave> <element name="module"> <element name="masteragent">...</element> </element> <zeroOrMore> <element name="module"> <element name="proxyagent">...</element> </element> </zeroOrMore> </interleave> </element> If you don't mind changing the way your instance looks, I suggest that you either: A. Define a moduleType type, and two derivations thereof -- masterAgentModule and proxyAgentModule. Then use xsi:type on individual <module> elements to indicate whether they hold <masterAgent> or <proxyAgent> elements. B. Call the <module> element that holds the <masterAgent> something other than "module", for example "masterModule". For either of the two latter cases, you could always define a transformation from the markup that's actually used to the validatable elements. Cheers, Jeni --- Jeni Tennison http://www.jenitennison.com/
Received on Thursday, 20 March 2003 04:29:34 UTC