[Nml-wg] Review of the XSD schema

Freek Dijkstra Freek.Dijkstra at sara.nl
Thu Dec 27 20:34:39 EST 2012


Here is my review of the XSD schema. Since I'm less verbose in XSD, it's
mostly a series of questions.

First of all I really like to compliment Roman -- you have been able to
even add rather complex constructs like implicit and explicit relations.
I also now understand the pros and cons of XSD much better (after having
read parts of the primer http://www.w3.org/TR/xmlschema-0/, as well as
the discussion
http://www.imc.org/ietf-xml-use/mail-archive/msg00217.html and rebuttal
http://www.imc.org/ietf-xml-use/mail-archive/msg00261.html -- see
further follow-ups for a nice cozy flamewar which may keep you warm
during the long cold nights during this winter season.)

General questions and remarks:
------------------------------

* Where does it specify that all NML descriptions should start with
nml:Topology as the root element?

* In the current schema, the order of child elements is very strict --
it is a sequence of elements in particular order. For example, a
relation element MUST occur before a Location element. If relation
occurs after a Location, the document is invalid.

Here is an excerpt for the schema:

>   <xs:complexType name="NetworkObject">
>     <xs:sequence>
>       <xs:element  name="name"       type="xs:string"          minOccurs="0"  maxOccurs="1"/>
>       <xs:element  name="relation"   type="nml:RelationType"   minOccurs="0" />
>       <xs:element  name="Location"   type="nml:LocationType"   minOccurs="0"  maxOccurs="1"/>
>       <xs:element  name="parameter"  type="nml:ParameterType"  minOccurs="0"/>
>       <!-- .... -->
>     </xs:sequence>
>     <!-- .... -->
>   </xs:complexType>

Instead, I would suggest to use xs:all:

>   <xs:complexType name="NetworkObject">
>     <xs:all>
>       <xs:element  name="name"       type="xs:string"          minOccurs="0"  maxOccurs="1"/>
>       <xs:element  name="relation"   type="nml:RelationType"   minOccurs="0" />
>       <xs:element  name="Location"   type="nml:LocationType"   minOccurs="0"  maxOccurs="1"/>
>       <xs:element  name="parameter"  type="nml:ParameterType"  minOccurs="0"/>
>       <!-- .... -->
>     </xs:all>
>     <!-- .... -->
>   </xs:complexType>

In XSD 1.0, this would limit the maxOccurs to 1, but XSD 1.1 no longer
has that restriction. Given that XSD 1.0 and XSD 1.1 use the same
namespace, perhaps it is good to make this explicit:

>   <xs:complexType name="NetworkObject">
>     <xs:all>
>       <xs:element  name="name"       type="xs:string"          minOccurs="0" maxOccurs="1" />
>       <xs:element  name="relation"   type="nml:RelationType"   minOccurs="0" maxOccurs="unbounded" />
>       <xs:element  name="Location"   type="nml:LocationType"   minOccurs="0" maxOccurs="1" />
>       <xs:element  name="parameter"  type="nml:ParameterType"  minOccurs="0" maxOccurs="unbounded" />
>       <!-- .... -->
>     </xs:all>
>     <!-- .... -->
>   </xs:complexType>

* I don't really understand how you are trying to deal with implicit and
explicit relations.
This seems at first very powerful (meaning: either use implicit or
explicit):

>       <xs:choice>
>         <xs:element  name="lifetime"     type="nml:LifeTimeType"     minOccurs="0"  maxOccurs="1"/>
>         <xs:element  name="existDuring"  type="nml:ExistDuringType"  minOccurs="0"  maxOccurs="1"/>
>       </xs:choice>

In fact there are four ways to represent implicit relations:

1.

<nml:Node id="...">
  <nml:name>My Device</nml:name>
  <nml:Location>
    <nml:name>Somewhere</nml:name>
  </nml:Location>
</nml:Node>

2.

<nml:Node id="...">
  <nml:name>My Device</nml:name>
  <nml:Relation type="http:....nml/base#locatedAt">
    <nml:Location>
      <nml:name>Somewhere</nml:name>
    </nml:Location>
  </nml:Relation>
</nml:Node>

3.

<nml:Node id="...">
  <nml:name>My Device</nml:name>
  <nml:Location id="..." />
</nml:Node>
<nml:Location id="...">
  <nml:name>Somewhere</nml:name>
</nml:Location>

4.

<nml:Node id="...">
  <nml:name>My Device</nml:name>
  <nml:Relation type="http:....nml/base#locatedAt">
    <nml:Location id="..." />
  </nml:Relation>
</nml:Node>
<nml:Location id="...">
  <nml:name>Somewhere</nml:name>
</nml:Location>

Currently, for Location/locatedAt only the form 1 seems allowed.
For LifeTime/existDuring only forms 1 and 3 seem allowed.

Is this on purpose? (I presume it is on purpose that the explicit
variants are not listed, but that the missing form #3 for Location is a
omission.)

* To iterate on existsDuring: It seems that the described form it even
slightly different:

<nml:Node id="...">
  <nml:name>My Device</nml:name>
  <nml:existDuring idRef="..." />
</nml:Node>

(thus without the <nml:LifeTime> wrapper)

Is that interpretation correct?

* The RelationType lists all possible relation URIs as values for the
type attribute. Is it permitted to use a URI not listed here? Thus, is
is possible to define a new relation in nml-experimental, without
changing nml-base?

Specific remarks:
-----------------

>     <xs:attribute  name="idRef"    type="xs:anyURI"        use="optional"/>
Remove line 32, as idRef is no longer used:

>       <xs:element  ref="nml:Port"  minOccurs="1"/>
Remove minOccurs on line 40:
(perhaps the minOccurs should be listed elsewhere?)

>     <xs:attribute  name="version"  type="xs:unsignedInt"   use="optional"/>
version type should be a dateTime on line 33:

For readability, I suggest to put xsd:attribute before xsd:elements, in
particular for NetworkObject and RelationType. (Simply because
attributes also come earlier in a document).

>       <xs:element  name="relation"   type="nml:RelationType"   minOccurs="0" />
* relation: should be capitalized as Relation on line 23:

Missing relation (lines 48-55):
- canProvidePort
(I assume that the implicit relations are not listed on purpose)

>          <xs:element  name="duration"  type="xs:duration"  minOccurs="0"  maxOccurs="1"/>
LifeTime does not have a duration (only a end):

LifeTime should not have an id attribute.

Location should have an id attribute.



Note: I have not yet looked at the cardinalities (minOccurs and
maxOccurs) yet, and only reviewed about the first 100 lines, so this is
an incomplete list of remarks.

Freek


More information about the nml-wg mailing list