Hi all,
here a little brain-twister (starting to spoil my weekend
if I do not find a solution ... ;-) )
What I want to do is to find a XML-Schema expression that builds
a grammar for the following XML document (fragment):
<grouping_docum ent>
<app_list>
<app id="id1">Progra m 1</app>
<app id="id2">Progra m 2</app>
<app id="id3">Progra m 3</app>
<!-- etc. -->
</app_list>
<grouping app_ref="id1 id3">
<!-- stuff for the referenced apps -->
</grouping>
<grouping app_ref="id2">
<!-- stuff for the referenced apps -->
</grouping>
</grouping_docume nt>
The <grouping_docum ent> describes some information that may be valid for
one or more applications. So it starts with a list of application definitions
whereas the key issue is that only the listed ids are allowed to appear as
values of attribute app_ref in the element <grouping>.
A valid DTD for this is
<!DOCTYPE grouping_docume nt [
<!ELEMENT grouping_docume nt ( app_list, grouping+ )>
<!ELEMENT app_list (app+)>
<!ELEMENT app (#PCDATA)>
<!ATTLIST app id ID #REQUIRED>
<!-- etc. -->
<!ELEMENT grouping (grouping_eleme nt+)>
<!ATTLIST grouping app_ref IDREFS #REQUIRED>
<!-- etc. -->
]>
But how to express these ID/IDREFS expressions in suitable in XML-Schema syntax?
(I do not have a problem with the standard key/keyref expressions. Where I'm
failing is the formulation of a list of references as value of a simple attribute.)
Here's what I have tried:
<xsd:complexTyp e name="GroupingT ype">
<xsd:sequence >
<xsd:element name="app_list" type="AppListTy pe">
<xsd:key name="AppKey">
<xsd:selector xpath="app"/>
<xsd:field xpath="@id"/>
</xsd:key>
</xsd:element>
<xsd:element name="grouping" type="GroupingT ype"/>
</xsd:sequence>
</xsd:complexType >
<!-- etc. -->
<complexType name="GroupingT ype">
<sequence>
<element name="grouping_ element">
<!-- etc. -->
</element>
</sequence>
<attribute name="id">
<simpleType name="AppIdList ">
<list itemType="strin g"/>
</simpleType>
<keyref name="aref" refer="jrn:AppK ey">
<field xpath="@app_id"/>
</keyref>
</attribute>
</complexType>
It's wrong, I know ...
But perhaps someone has a little tip for me?
Many thanks for your efforts!
Rabe