- From: Eddie Robertsson <eddie@allette.com.au>
- Date: Fri, 07 Sep 2001 09:42:45 +1000
- To: "Fossberg, Margrethe" <FossbergM@logica.com>
- CC: "'xmlschema-dev@w3.org'" <xmlschema-dev@w3.org>
Hi Maggie, > I am still trying to learn the basics of XML Schema, and I haven't been able > to work out whether there is a way of restricting a group of values in an > instance document i.e. I would like, say, elements a, b, and c to have a min > value of 0 and max value of 15, but the total sum of a, b and c cannot > exceed 30. Is this possible at all? Unfortunately there is no way of doing this with this version of W3C XML Schema. These kind of co-constraints are on the agenda for the next version whenever that will happen. In the mean time my favourite way of dealing with these types of problems is to embedd a Schematron rule that applies the constraints you can't do with the W3C XML Schema. Here is an example of what that would look like in your case: <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:element name="Root"> <xs:annotation> <xs:appinfo> <pattern name="Sum of child elements" xmlns="http://www.ascc.net/xml/schematron"> <rule context="Root"> <assert test="sum(*) <= 30">The sum of the child elements must be less than or equal to 30.</assert> </rule> </pattern> </xs:appinfo> </xs:annotation> <xs:complexType> <xs:sequence> <xs:element name="a" type="myInteger"/> <xs:element name="b" type="myInteger"/> <xs:element name="c" type="myInteger"/> </xs:sequence> </xs:complexType> </xs:element> <xs:simpleType name="myInteger"> <xs:restriction base="xs:integer"> <xs:minInclusive value="0"/> <xs:maxInclusive value="15"/> </xs:restriction> </xs:simpleType> </xs:schema> This would validate the following instance document: <?xml version="1.0" encoding="UTF-8"?> <Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="E:\Work\XMLSchema\XML-DEV\Schtrn+W3C\sum_lt_30.xsd"> <a>10</a> <b>10</b> <c>10</c> </Root> by this would be invalid: <?xml version="1.0" encoding="UTF-8"?> <Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="E:\Work\XMLSchema\XML-DEV\Schtrn+W3C\sum_lt_30.xsd"> <a>10</a> <b>10</b> <c>12</c> </Root> The Schematron Validator available from Topologi [1] can validate a W3C XML Schema with embedded Schematron information. For more information about Schematron see [2] and more information about extending W3C XML Schema see [3]. Cheers, /Eddie [1] www.topologi.com [2] http://www.ascc.net/xml/resource/schematron/ [3] http://www.xfront.com/BestPracticesHomepage.html
Received on Thursday, 6 September 2001 19:42:41 UTC