Re: [xml-dev] RelaxNG question

From
Bill de hÓra <>
To
Tim Bray <>
Date
2003-08-18T23:28:51Z
ID
<>
Thread
Re: [xml-dev] RelaxNG question
Tim Bray wrote:

> Dare Obasanjo wrote:
> 
>> Anyway the point is that there are XML vocabularies that have this 
>> characteristic which unfortunately cannot be described by any of the 
>> popular XML schema languages. 
> 
> 
> I'm probably missing something, but it seems on the face of it that you 
> can disallow non-namespaced names in RelaxNG.
> 
> namespace NoNS = ""
> 
> HasNS = element * - ( NoNS:* )
> {
>   attribute * { text }*,
>   mixed { HasNS* }
> }
> 
> element package { mixed HasNS* }



Not sure that'll work. I get a syntax error for the last line there, 
but the HasNS structure blows out to:

     <define name="HasNS">
       <element>
         <anyName>
           <except>
             <nsName ns=""/>
           </except>
         </anyName>
         <zeroOrMore>
           <attribute>
             <anyName/>
           </attribute>
         </zeroOrMore>
         <mixed>
           <zeroOrMore>
             <ref name="HasNS"/>
           </zeroOrMore>
         </mixed>
       </element>
   </define>

[sorry, I'm not great with the rnc]

which allows children to be in the parent namespace against the 
fragments I'll playing with. I changed it to include the specd namespace

     <define name="HasNS">
       <element>
         <anyName>
           <except>
             <nsName ns=""/>
             <nsName ns="http://www.example.com"/>
           </except>
         </anyName>
         <zeroOrMore>
           <attribute>
             <anyName/>
           </attribute>
         </zeroOrMore>
         <mixed>
           <zeroOrMore>
             <ref name="HasNS"/>
           </zeroOrMore>
         </mixed>
       </element>
   </define>


and blew this out:

   namespace local = ""
   namespace ns1 = "http://www.example.com"

   HasNS =
    element * - (local:* | ns1:*) {
      attribute * { text }*,
      mixed { HasNS* }
    }

which I think stops non-ns names (why I am doing this? ;) and the 
specified ns on the parent. Full structures with all the other 
attribute stuff attached.

Bill de hÓra

-- 
Technical Architect
Propylon
http://www.propylon.com


namespace local = ""
default namespace ns1 = "http://www.example.com"

start = anyWithNS
anyWithNS =
  element grammar {
    attribute * { text }*,
    (text | inverseNS)*
  }
HasNS =
  element * - (local:* | ns1:*) {
    attribute * - (local:* | ns1:*) { text }*,
    (text | HasNS)*
  }