- From: Jeni Tennison <jeni@jenitennison.com>
- Date: Tue, 20 Jul 2004 14:45:59 +0100
- To: Adam van den Hoven <avandenhoven@cucbc.com>
- Cc: XML Schema Development <xmlschema-dev@w3.org>
Hi Adam,
Just to add to Mike's reply: what you have to do in this situation is
use unioned paths that select all the directories and files, as
follows:
<xs:key name="paths">
<xs:selector xpath="directory | file"/>
<xs:field xpath="@step"/>
</xs:key>
Another problem with your current schema is that you've defined this
identity constraint on the <node> element. Identity constraints only
apply to the element on which you define them -- unlike types, they
aren't inherited via the substitution group hierarchy. You never have
any <node> elements in your document (since they're abstract), so the
key will never come into play. The identity constraints should
probably be defined on the <directory> element instead.
Also, I'm not sure what constraint you actually want to test here.
Currently you're testing that, within one particular <node>, no
*child* <directory> or <file> has the same step as any other. Do you
want to make sure that in the document *as a whole* there aren't any
directories or files with the same value for their step attributes? If
so, then rather than defining the identity constraint on the <node>
element, you should define it on the <directory> element (since that's
your document element) and define the key over all the descendant (not
just children) <directory> and <file> elements:
<xs:key name="paths">
<xs:selector xpath=".//directory | .//file"/>
<xs:field xpath="@step"/>
</xs:key>
> In preparing this example, I started getting exceptions on the
> LeafType delcaration. Namely, I'm being told:
>
> cos-particle-restrict.2: Forbidden particle restriction:
> 'choice:all,sequence,elt'.
> derivation-ok-restriction.5.4.2: Error for type 'LeafType'. The
> particle of the type is not a valid restriction of the particle of the base.
>
> Both errors refer to the LeafType complexType.
The rules governing legal restrictions are really complicated,
especially when you start factoring in substitution groups and
wildcards. The element particle for <node> is replaced with a choice
between the members of the substitution groups. Xerces seems to be
objecting to the way that choice gets restricted (MSXML is happy with
it). I found that doing:
<xs:complexType name="LeafType">
<xs:complexContent>
<xs:restriction base="NodeType">
<xs:sequence>
<xs:element ref="title" minOccurs="0" maxOccurs="unbounded"/>
<xs:choice minOccurs="0" />
</xs:sequence>
<xs:attribute name="step" type="xs:NMTOKEN"/>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
Fixed the problem. (The minOccurs="0" on the empty <xs:choice> is only
necessary if you want it to work in MSXML as well.)
Alternatively, you could reverse the hierarchy like this:
<xs:complexType name="LeafType">
<xs:sequence>
<xs:element ref="title" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="step" type="xs:NMTOKEN" />
</xs:complexType>
<xs:complexType name="NodeType">
<xs:complexContent>
<xs:extension base="LeafType">
<xs:sequence>
<xs:element ref="node" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
Finally, another thing I noticed in your schema. You have:
> <xs:complexType name="Label" id="ComplexType.Label">
> <xs:simpleContent>
> <xs:restriction base="Title">
> <xs:attribute ref="role" fixed="label" use="prohibited"/>
> </xs:restriction>
> </xs:simpleContent>
> </xs:complexType>
The <xs:attribute> here isn't doing what you think it's doing.
use="prohibited" means that, in this restriction, the previously
optional attribute is no longer allowed: it's a mechanism for
excluding attributes that are otherwise inherited when you derive a
type by restriction.
Without the use="prohibited", the <xs:attribute> would mean that if an
element of the type Label had a role attribute, it would have to
have the value 'label', and if it didn't then a role attribute would
be added to it in the PSVI.
But with the use="prohibited", you're saying that the elements of type
Label don't have role attributes at all. Importantly, this means that
you won't get the role attributes added in the PSVI. So the
fixed="label" does nothing here.
Cheers,
Jeni
---
Jeni Tennison
http://www.jenitennison.com/
Received on Tuesday, 20 July 2004 09:46:04 UTC