- From: Jeni Tennison <jeni@jenitennison.com>
- Date: Tue, 18 Nov 2003 16:18:18 +0000
- To: Hans Teijgeler <hans.teijgeler@quicknet.nl>
- Cc: "xml-schema, mailing list" <xmlschema-dev@w3.org>
Hi Hans, > then Spy (version 4.4) tells me that: > > * I MUST fill in a string in the 'optional-attribute', which doesn't > make sense to me, because that means that my application has to > remove all non-filled-in optional attributes from the XML document > (then Spy accepts the file as valid) An optional attribute is an attribute that might or might not *exist*, not one that might or might not have a value. If an optional attribute is present on an element, then it must have a value that adheres to the type of the attribute. In this case, it's valid for attributes (and elements) of type xs:string to have an empty value, so the following should all be valid with the schema you showed: --- <test-element xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="D:\XML\test-of-optionality.xsd" optional-attribute="" required-attribute="test" /> --- <test-element xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="D:\XML\test-of-optionality.xsd" optional-attribute="test" required-attribute="test" /> --- <test-element xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="D:\XML\test-of-optionality.xsd" required-attribute="test" /> --- <test-element xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="D:\XML\test-of-optionality.xsd" required-attribute="" /> --- On the other hand, if you'd declared that the optional-attribute and required-attribute had a type of xs:integer (for which empty values aren't valid) then, if present, the optional-attribute would have to have a value. In other words, the following would be valid: --- <test-element xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="D:\XML\test-of-optionality.xsd" optional-attribute="1" required-attribute="2" /> --- <test-element xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="D:\XML\test-of-optionality.xsd" required-attribute="1" /> --- and the following wouldn't be valid: --- <test-element xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="D:\XML\test-of-optionality.xsd" optional-attribute="" required-attribute="1" /> --- If you want to declare an attribute that has to be present, but may or may not have a value, and the type for the attribute must be an xs:integer (say), then you need to declare a type for the attribute that's a union of the type that you want for the attribute (e.g. xs:integer) and an empty string, as in: <xs:attribute name="attribute-with-optional-value"> <xs:simpleType> <xs:union memberTypes="xs:integer"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="" /> </xs:restriction> </xs:simpleType> </xs:union> </xs:simpleType> </xs:attribute> > * I may not fill in a string in the 'prohibited-attribute', which > makes sense Note that "prohibited" attributes are only useful when doing derivation by restriction from a type that allows that attribute specifically (as an optional attribute); it makes no sense to define a prohibited attribute within a complex type that's derived from xs:anyType. Cheers, Jeni --- Jeni Tennison http://www.jenitennison.com/
Received on Tuesday, 18 November 2003 11:18:30 UTC