Hi Marcos,
> how can write an schema where an element has two ways of be
> described?
You can't, I'm afraid, not using W3C XML Schema, at least not if the
element appears with the two different types in the same content
model. W3C XML Schema has a constraint that says that in a particular
content model, all the element particles with a particular name must
have the same type as well. It also doesn't have the facility of
allowing element content to be determined by what attributes are there
or not (co-occurrence constraints).
You can specify a general type for the element that covers both your
possibilities:
<xs:element name="myelement">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element ref="mynestedelement" minOccurs="0" />
</xs:sequence>
<xs:attribute name="name" type="xs:NMTOKEN" />
<xs:attribute name="a" type="xs:integer" />
<xs:attribute name="b" type="xs:integer" />
<xs:attribute name="href" type="xs:anyURI" />
<xs:attribute name="path" type="xs:token" />
</xs:complexType>
</xs:element>
and then have a separate Schematron rule that tests the combinations,
for example:
<sch:rule context="myelement">
<sch:assert test="(@name and @a and @b and mynestedelement and
not(@href) and not(@path)) or
(@href and @path and
not(@name) and not(@a) and not(@b) and not(*))">
"myelement" elements must either have a name, a and b attributes
and a mynestedelement child or have an href and a path
attribute.
</sch:assert>
</sch:rule>
Or you can switch to a different schema language, such as RELAX NG,
which does support this kind of thing:
<element name="myelement">
<choice>
<group>
<attribute name="name"><data type="xs:NMTOKEN" /></attribute>
<attribute name="a"><data type="xs:integer" /></attribute>
<attribute name="b"><data type="xs:integer" /></attribute>
<ref name="mynestedelement" />
</group>
<group>
<attribute name="href"><data type="xs:anyURI" /></attribute>
<attribute name="path"><data type="xs:token" /></attribute>
<text />
</group>
</choice>
</element>
Cheers,
Jeni
---
Jeni Tennison
http://www.jenitennison.com/