"Migration" from IDREFS to an XML-Schema expression

R

Rabe

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_document>
<app_list>
<app id="id1">Program 1</app>
<app id="id2">Program 2</app>
<app id="id3">Program 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_document>


The <grouping_document> 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_document [
<!ELEMENT grouping_document ( app_list, grouping+ )>

<!ELEMENT app_list (app+)>
<!ELEMENT app (#PCDATA)>
<!ATTLIST app id ID #REQUIRED>

<!-- etc. -->

<!ELEMENT grouping (grouping_element+)>
<!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:complexType name="GroupingType">
<xsd:sequence>
<xsd:element name="app_list" type="AppListType">
<xsd:key name="AppKey">
<xsd:selector xpath="app"/>
<xsd:field xpath="@id"/>
</xsd:key>
</xsd:element>
<xsd:element name="grouping" type="GroupingType"/>
</xsd:sequence>
</xsd:complexType>

<!-- etc. -->

<complexType name="GroupingType">
<sequence>
<element name="grouping_element">
<!-- etc. -->
</element>
</sequence>

<attribute name="id">
<simpleType name="AppIdList">
<list itemType="string"/>
</simpleType>
<keyref name="aref" refer="jrn:AppKey">
<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
 
M

Martin Honnen

Rabe wrote:

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_document>
<app_list>
<app id="id1">Program 1</app>
<app id="id2">Program 2</app>
<app id="id3">Program 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_document>


The <grouping_document> 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_document [
<!ELEMENT grouping_document ( app_list, grouping+ )>

<!ELEMENT app_list (app+)>
<!ELEMENT app (#PCDATA)>
<!ATTLIST app id ID #REQUIRED>

<!-- etc. -->

<!ELEMENT grouping (grouping_element+)>
<!ATTLIST grouping app_ref IDREFS #REQUIRED>

But a W3C XML schema allows you to define attributes of type xs:ID as
well as of type xs:IDREFS, see
http://www.w3.org/TR/xmlschema-2/#built-in-datatypes
http://www.w3.org/TR/xmlschema-2/#ID
http://www.w3.org/TR/xmlschema-2/#IDREFS
so you can simply type your attributes as you have typed them in the DTD.
 
R

R. B.

Hi,

thanks for your answer, I think it would (will!) work. (I know that
these types are valid in schema definitions too but I actually didn't
have the idea to use them ... :)) )

But nevertheless there must be a solution to express ID/IDREFS in schema
syntax too, don't you think so?

As far as I know ID declarations bring up the problem that they are
global all over the document. So if I have a lot of ID declarations in
different elements how can I be sure that I'm referencing always the
right type of id?

When I expand my example with a list

<resource_list>
<resource id="res_id1"/>
<resource id="res_id2"/>
<resource id="res_id3"/>
</resource_list>

I will be able to reference a pretended application "res_id1" e.g.

<grouping app_ref="id1 res_id1">
<!-- stuff for the referenced apps -->
</grouping>

which is syntactically correct but semantically nonsense ...

Hmm ...

But your tip helped me a lot - I was already thinking about changing the
structure of my instance document ...

Bye Rabe
 
M

Martin Honnen

R. B. wrote:

thanks for your answer, I think it would (will!) work. (I know that
these types are valid in schema definitions too but I actually didn't
have the idea to use them ... :)) )

But nevertheless there must be a solution to express ID/IDREFS in schema
syntax too, don't you think so?

I told you to use the xs:ID and xs:IDREFS types, those are schema types,
so I am not sure why you ask for schema syntax, if you use
<xs:attribute name="id" type="xs:ID" />
then that is schema syntax and that is all I suggested to do.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,768
Messages
2,569,575
Members
45,053
Latest member
billing-software

Latest Threads

Top