[xml] Relax NG schemas - behaviour of parentRef changes when used with externalRef
- From: Peter Howard <peterh ok-labs com>
- To: <xml gnome org>
- Subject: [xml] Relax NG schemas - behaviour of parentRef changes when used with externalRef
- Date: Mon, 18 Jul 2011 21:07:08 +1000
Hi all,
My understanding of the behaviour of nested Relax NG grammars is that
putting them into an external file and referencing via <externalRef>
should be identical to having the nested grammar in the main file. But
I'm not seeing that from libxml2 2.7.8 (specifically 2.7.8.dfsg-2ub in
ubuntu)
Consider the following simple grammar.
<?xml version="1.0"?>
<grammar xmlns="http://relaxng.org/ns/structure/1.0"
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
<start>
<element name="foo">
<ref name="bar"/>
</element>
</start>
<define name="bar">
<grammar xmlns="http://relaxng.org/ns/structure/1.0"
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
<start>
<element name="bar">
<parentRef name="na"/>
</element>
</start>
</grammar>
</define>
<define name="na">
<attribute name="name">
<data type="string"/>
</attribute>
</define>
And the same grammar broken into two files: core.rng,
<?xml version="1.0"?>
<grammar xmlns="http://relaxng.org/ns/structure/1.0"
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
<start>
<element name="foo">
<ref name="bar"/>
</element>
</start>
<define name="bar">
<externalRef href="extern.rng"/>
</define>
<define name="na">
<attribute name="name">
<data type="string"/>
</attribute>
</define>
</grammar>
and the external grammar.
<?xml version="1.0"?>
<grammar xmlns="http://relaxng.org/ns/structure/1.0"
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
<start>
<element name="bar">
<parentRef name="na"/>
</element>
</start>
</grammar>
I wrote this small python script (using python-lxml which wraps libxml2)
#!/usr/bin/env python
from lxml import etree
import sys
schema_file = sys.argv[1]
print "load %s" % schema_file
sch = etree.RelaxNG(file=schema_file)
When I run test.py and pass in the first form, it loads without error.
When I run test.py and pass in the second form I get the following
output:
peterh citypig:~$ ./test.py core.rng
load core.rng
Traceback (most recent call last):
File "./test.py", line 9, in <module>
sch = etree.RelaxNG(file=schema_file)
File "relaxng.pxi", line 86, in lxml.etree.RelaxNG.__init__ (src/lxml/lxml.etree.c:127492)
lxml.etree.RelaxNGParseError: Use of parentRef without a parent grammar, line 5
(the error is generated in relaxng.c)
So, is this a bug in libxml2, or have I misunderstood the way things work?
Thanks
--
Peter Howard <peterh ok-labs com>
OK Labs
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]