OASIS Mailing List ArchivesView the OASIS mailing list archive below
or browse/search using MarkMail.

 


Help: OASIS Mailing Lists Help | MarkMail Help

relax-ng message

[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [Elist Home]


Subject: Re: Example [Was: Two things to strengthen the spec]


Michael Fitzgerald wrote:

> OK. James and Makoto are the doorkeepers for the spec. I was merely leaning
> on the doorbell. I shall relent.

Oh, please don't give up easily!

I have created an example.  It can be an informative appendix of the specification.
 How do you feel about this?

1) An instance document in the XML syntax

<?xml version="1.0"?>
<foo xmlns=""
 ><pre1:bar1 xmlns:pre1="http://n1"
/><pre2:bar2 xmlns:pre2="http://n2"
/></foo>

Note: The root element has two child elements but has no 
child strings.

3) This instance document in the data model

This document is represented by an element foo
containing two child elements.

The root element e0 is represented by

	element(name("", foo), cx0, {}, {e1, e2}), 

where cx0 is a context {"" -> ""} and e1 (e2) represent the first
(resp., second) child element.

e1

	element(name("http://n1", bar1), cx1, {}, {})

e2
	element(name("http://n2", bar2), cx2, {}, {})

where cx1 and cx2 are contexts {"" -> "", pre1 -> "http://n1"} and
{"" -> "", pre2 -> "http://n2"}, respectively.  (We omit the base 
URI in this example.)

3) schema

This grammar is normalized as defined in Section 5 and satisfies the
restrictions in Section 7.

<grammar ns="" xmlns="http://relaxng.org/ns/structure/0.9">
  <start>
    <ref name="foo"/>
  </start>

<define name="foo">
  <element>
    <name>foo</name>
    <group>
      <ref name="bar1"/>
      <ref name="bar2"/>
    </group>
  </element>
</define>

<define name="bar1">
  <element>
    <name ns="http://n1">bar1</name>
    <empty/>
  </element>
</define>

<define name="bar2">
  <element>
    <name ns="http://n2">bar2</name>
    <empty/>
  </element>
</define>
</grammar>

4) Validation

Let nameclass nc1 = <name ns="http://n1">bar1</name> and 
nameclass nc2 = <name ns="http://n2">bar2</name>.

Then, by the inference rule (name) in 6.1, we have

	name("http://n1", "bar1") in nc1

and 
	name("http://n2", "bar2") in nc2 .

By the inference rule (empty) in 6.2.3, we have

	cx1 |= {};() = <empty/> => {};{}

and 

	cx2 |= {};() = <empty/> => {};{}

Since 

	deref(bar1) = 
	  <element>
	    <name ns="http://n1">bar1</name>
	    <empty/>
	  </element>

we have

	cx0 |-   {}; e1 =~ <ref name="bar1"/> => {}; {}

by applying the inference rule (element) in 6.2.8.   Note that 
we have chosen cx0, since any context is allowed.

Likewise, we have 

	cx0 |-   {}; e2 =~ <ref name="bar2"/>  => {}; {}

By the inference rule (group) in 6.2.1, we have 

	cx0 |-   {}; (e1, e2)
	           =~ <group><ref name="bar1"/><ref name="bar2"/></group>
			=> {}; {}

Since

deref(foo) = <element><name>foo</name>
              <group>
                <ref name="bar1"/>
                <ref name="bar2"/>
              </group>
             </element>
,

we have 

	cx3 |- {}; element(name("", foo), cx0, {}, {e1, e2}) =~ 
                     <ref name="foo"/> => {}; {}

by the the inference rule (element) in 6.2.8 again.  Here
cx3 is an arbitrary context.

Finally, since start() = <ref name="foo"/>, we can apply the 
inference rule (valid) in 6.4 and obtain

	valid(e0)


Cheers,

Makoto
 
Internet: mura034@attglobal.net
Nifty: VEQ00625


[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [Elist Home]


Powered by eList eXpress LLC