[
Lists Home |
Date Index |
Thread Index
]
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
<?xml version="1.0"?>
<grammar
xmlns="http://relaxng.org/ns/structure/1.0"
>
<start>
<ref name="anyWithNS"/>
</start>
<define name="anyWithNS">
<element name="grammar" ns="http://www.example.com">
<zeroOrMore>
<attribute>
<anyName>
</anyName>
</attribute>
</zeroOrMore>
<zeroOrMore>
<choice>
<text/>
<ref name="inverseNS" />
</choice>
</zeroOrMore>
</element>
</define>
<define name="HasNS">
<element>
<anyName >
<except>
<nsName ns=""/>
<nsName ns="http://www.example.com"/>
</except>
</anyName >
<zeroOrMore>
<attribute>
<anyName>
<except>
<nsName ns="" />
<nsName ns="http://www.example.com" />
</except>
</anyName>
</attribute>
</zeroOrMore>
<zeroOrMore>
<choice>
<text/>
<ref name="HasNS" />
</choice>
</zeroOrMore>
</element>
</define>
</grammar>
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)*
}
|