include seems to work okay now augmented/updated the regression tests
* relaxng: include seems to work okay now
* test/relaxng/* result/relaxng/*: augmented/updated the
regression tests
Daniel
diff --git a/ChangeLog b/ChangeLog
index 1635b9d..67cf344 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Sun Feb 2 15:33:38 CET 2003 Daniel Veillard <daniel@veillard.com>
+
+ * relaxng: include seems to work okay now
+ * test/relaxng/* result/relaxng/*: augmented/updated the
+ regression tests
+
Sat Feb 1 19:44:58 CET 2003 Daniel Veillard <daniel@veillard.com>
* relaxng.c: a bit of work done in the train back.
diff --git a/relaxng.c b/relaxng.c
index 5dcd046..220edba 100644
--- a/relaxng.c
+++ b/relaxng.c
@@ -8,10 +8,10 @@
/**
* TODO:
- * - <interleave></interleave><element>...
* - error reporting
- * - module
- * - fixing ref/def cross grammar contexts
+ * - simplification of the resulting compiled trees:
+ * - NOT_ALLOWED
+ * - EMPTY
*/
#define IN_LIBXML
@@ -1560,6 +1560,8 @@
xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node);
static xmlRelaxNGPtr xmlRelaxNGParseDocument(
xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node);
+static int xmlRelaxNGParseGrammarContent(
+ xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr nodes);
#define IS_BLANK_NODE(n) \
@@ -2087,13 +2089,68 @@
}
/**
+ * xmlRelaxNGParseInclude:
+ * @ctxt: a Relax-NG parser context
+ * @node: the include node
+ *
+ * Integrate the content of an include node in the current grammar
+ *
+ * Returns 0 in case of success or -1 in case of error
+ */
+static int
+xmlRelaxNGParseInclude(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) {
+ xmlRelaxNGIncludePtr incl;
+ xmlNodePtr root;
+ int ret = 0, tmp;
+
+ incl = node->_private;
+ if (incl == NULL) {
+ if (ctxt->error != NULL)
+ ctxt->error(ctxt->userData,
+ "Include node has no data\n");
+ ctxt->nbErrors++;
+ return(-1);
+ }
+ root = xmlDocGetRootElement(incl->doc);
+ if (root == NULL) {
+ if (ctxt->error != NULL)
+ ctxt->error(ctxt->userData,
+ "Include document is empty\n");
+ ctxt->nbErrors++;
+ return(-1);
+ }
+ if (!xmlStrEqual(root->name, BAD_CAST "grammar")) {
+ if (ctxt->error != NULL)
+ ctxt->error(ctxt->userData,
+ "Include document root is not a grammar\n");
+ ctxt->nbErrors++;
+ return(-1);
+ }
+
+ /*
+ * Merge the definition from both the include and the internal list
+ */
+ if (root->children != NULL) {
+ tmp = xmlRelaxNGParseGrammarContent(ctxt, root->children);
+ if (tmp != 0)
+ ret = -1;
+ }
+ if (node->children != NULL) {
+ tmp = xmlRelaxNGParseGrammarContent(ctxt, node->children);
+ if (tmp != 0)
+ ret = -1;
+ }
+ return(ret);
+}
+
+/**
* xmlRelaxNGParseDefine:
* @ctxt: a Relax-NG parser context
* @node: the define node
*
* parse the content of a RelaxNG define element node.
*
- * Returns the definition pointer or NULL in case of error.
+ * Returns 0 in case of success or -1 in case of error
*/
static int
xmlRelaxNGParseDefine(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) {
@@ -2332,8 +2389,20 @@
} else {
def = NULL;
}
+ } else if (IS_RELAXNG(node, "notAllowed")) {
+ def = xmlRelaxNGNewDefine(ctxt, node);
+ if (def == NULL)
+ return(NULL);
+ def->type = XML_RELAXNG_NOT_ALLOWED;
+ if (node->children != NULL) {
+ if (ctxt->error != NULL)
+ ctxt->error(ctxt->userData,
+ "xmlRelaxNGParse: notAllowed element is not empty\n");
+ ctxt->nbErrors++;
+ }
} else {
TODO
+ def = NULL;
}
return(def);
}
@@ -2644,10 +2713,9 @@
* Returns 0 in case of success, -1 in case of error
*/
static int
-xmlRelaxNGParseGrammarContent(xmlRelaxNGParserCtxtPtr ctxt
- ATTRIBUTE_UNUSED, xmlNodePtr nodes)
+xmlRelaxNGParseGrammarContent(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr nodes)
{
- int ret = 0;
+ int ret = 0, tmp;
if (nodes == NULL) {
if (ctxt->error != NULL)
@@ -2656,30 +2724,30 @@
ctxt->nbErrors++;
return(-1);
}
- if (IS_RELAXNG(nodes, "start")) {
- if (nodes->children == NULL) {
- if (ctxt->error != NULL)
- ctxt->error(ctxt->userData,
- "grammar has no children\n");
- ctxt->nbErrors++;
- } else {
- xmlRelaxNGParseStart(ctxt, nodes->children);
- }
- nodes = nodes->next;
- } else {
- if (ctxt->error != NULL)
- ctxt->error(ctxt->userData,
- "grammar first child must be a <start>\n");
- ctxt->nbErrors++;
- return(-1);
- }
while (nodes != NULL) {
- if (IS_RELAXNG(nodes, "define")) {
- ret = xmlRelaxNGParseDefine(ctxt, nodes);
+ if (IS_RELAXNG(nodes, "start")) {
+ if (nodes->children == NULL) {
+ if (ctxt->error != NULL)
+ ctxt->error(ctxt->userData,
+ "grammar has no children\n");
+ ctxt->nbErrors++;
+ } else {
+ tmp = xmlRelaxNGParseStart(ctxt, nodes->children);
+ if (tmp != 0)
+ ret = -1;
+ }
+ } else if (IS_RELAXNG(nodes, "define")) {
+ tmp = xmlRelaxNGParseDefine(ctxt, nodes);
+ if (tmp != 0)
+ ret = -1;
+ } else if (IS_RELAXNG(nodes, "include")) {
+ tmp = xmlRelaxNGParseInclude(ctxt, nodes);
+ if (tmp != 0)
+ ret = -1;
} else {
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
- "grammar allows onlys <define> child after <start>\n");
+ "grammar has unexpected child %s\n", nodes->name);
ctxt->nbErrors++;
ret = -1;
}
@@ -3213,23 +3281,7 @@
delete = cur;
goto skip_children;
} else {
- if (xmlStrEqual(cur->name, BAD_CAST "div")) {
- /*
- * implements rule 4.11
- */
- xmlNodePtr child, ins, tmp;
-
- child = cur->children;
- ins = child;
- while (child != NULL) {
- tmp = child->next;
- xmlUnlinkNode(child);
- ins = xmlAddNextSibling(ins, child);
- child = tmp;
- }
- delete = cur;
- goto skip_children;
- } else if (xmlStrEqual(cur->name, BAD_CAST "externalRef")) {
+ if (xmlStrEqual(cur->name, BAD_CAST "externalRef")) {
xmlChar *href, *ns, *base, *URL;
xmlRelaxNGDocumentPtr docu;
@@ -3281,7 +3333,7 @@
if (href == NULL) {
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
- "xmlRelaxNGParse: externalRef has no href attribute\n");
+ "xmlRelaxNGParse: include has no href attribute\n");
ctxt->nbErrors++;
delete = cur;
goto skip_children;
@@ -3291,7 +3343,7 @@
if (URL == NULL) {
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
- "Failed to compute URL for externalRef %s\n", href);
+ "Failed to compute URL for include %s\n", href);
ctxt->nbErrors++;
if (href != NULL)
xmlFree(href);
@@ -3308,7 +3360,7 @@
if (incl == NULL) {
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
- "Failed to load externalRef %s\n", URL);
+ "Failed to load include %s\n", URL);
ctxt->nbErrors++;
xmlFree(URL);
delete = cur;
@@ -3418,6 +3470,27 @@
}
}
}
+ /*
+ * Thisd is not an else since "include" is transformed
+ * into a div
+ */
+ if (xmlStrEqual(cur->name, BAD_CAST "div")) {
+ /*
+ * implements rule 4.11
+ */
+ xmlNodePtr child, ins, tmp;
+
+ child = cur->children;
+ ins = child;
+ while (child != NULL) {
+ tmp = child->next;
+ xmlUnlinkNode(child);
+ ins = xmlAddNextSibling(ins, child);
+ child = tmp;
+ }
+ delete = cur;
+ goto skip_children;
+ }
}
}
/*
@@ -3587,6 +3660,8 @@
ctxt->document = NULL;
ret->documents = ctxt->documents;
ctxt->documents = NULL;
+ ret->includes = ctxt->includes;
+ ctxt->includes = NULL;
return (ret);
}
@@ -4631,8 +4706,7 @@
#endif
return(0);
case XML_RELAXNG_NOT_ALLOWED:
- TODO
- break;
+ return(-1);
case XML_RELAXNG_TEXT:
if (node == NULL)
return(0);
@@ -4794,6 +4868,7 @@
ctxt->flags = oldflags;
break;
}
+ case XML_RELAXNG_DEF:
case XML_RELAXNG_GROUP: {
xmlRelaxNGDefinePtr list = define->content;
@@ -4815,9 +4890,6 @@
case XML_RELAXNG_REF:
ret = xmlRelaxNGValidateDefinition(ctxt, define->content);
break;
- case XML_RELAXNG_DEF:
- ret = xmlRelaxNGValidateDefinition(ctxt, define->content);
- break;
case XML_RELAXNG_DATATYPE: {
xmlChar *content;
diff --git a/result/relaxng/tutor3_2_1.err b/result/relaxng/tutor3_2_1.err
index 28a6d51..28f4b55 100644
--- a/result/relaxng/tutor3_2_1.err
+++ b/result/relaxng/tutor3_2_1.err
@@ -1,3 +1,3 @@
-error detected at relaxng.c:4293
-error detected at relaxng.c:4341
+error detected at relaxng.c:4733
+error detected at relaxng.c:4781
xmlRelaxNGValidateDefinition(): validated card : -1
diff --git a/result/relaxng/tutor3_5_2.err b/result/relaxng/tutor3_5_2.err
index fc5adef..5730024 100644
--- a/result/relaxng/tutor3_5_2.err
+++ b/result/relaxng/tutor3_5_2.err
@@ -1,5 +1,5 @@
xmlRelaxNGValidateAttribute(name): -1
xmlRelaxNGValidateDefinition(): validated email : 0
xmlRelaxNGValidateDefinition(): validated card : -1
-error detected at relaxng.c:4341
+error detected at relaxng.c:4781
xmlRelaxNGValidateDefinition(): validated addressBook : -1
diff --git a/result/relaxng/tutor4_1_1 b/result/relaxng/tutor4_1_1
index 373a10d..d8f436d 100644
--- a/result/relaxng/tutor4_1_1
+++ b/result/relaxng/tutor4_1_1
@@ -1,2 +1 @@
-Extra content for element addressBook
-./test/relaxng/tutor4_1_1.xml validation generated an internal error
+./test/relaxng/tutor4_1_1.xml validates
diff --git a/result/relaxng/tutor4_1_1.err b/result/relaxng/tutor4_1_1.err
index 1e44ce9..adaf345 100644
--- a/result/relaxng/tutor4_1_1.err
+++ b/result/relaxng/tutor4_1_1.err
@@ -1,4 +1,7 @@
xmlRelaxNGValidateDefinition(): validated name : 0
-xmlRelaxNGValidateDefinition(): validated card : -1
-error detected at relaxng.c:4341
-xmlRelaxNGValidateDefinition(): validated addressBook : -1
+xmlRelaxNGValidateDefinition(): validated email : 0
+xmlRelaxNGValidateDefinition(): validated card : 0
+xmlRelaxNGValidateDefinition(): validated name : 0
+xmlRelaxNGValidateDefinition(): validated email : 0
+xmlRelaxNGValidateDefinition(): validated card : 0
+xmlRelaxNGValidateDefinition(): validated addressBook : 0
diff --git a/result/relaxng/tutor5_3_1.err b/result/relaxng/tutor5_3_1.err
index a719419..0e2f256 100644
--- a/result/relaxng/tutor5_3_1.err
+++ b/result/relaxng/tutor5_3_1.err
@@ -1,3 +1,3 @@
-error detected at relaxng.c:4472
+error detected at relaxng.c:4910
xmlRelaxNGValidateDefinition(): validated note : 0
xmlRelaxNGValidateDefinition(): validated bad : -1
diff --git a/result/relaxng/tutor6_1_3.err b/result/relaxng/tutor6_1_3.err
index bfb47f3..c11ebed 100644
--- a/result/relaxng/tutor6_1_3.err
+++ b/result/relaxng/tutor6_1_3.err
@@ -1,5 +1,5 @@
xmlRelaxNGValidateAttribute(preferredFormat): -1
xmlRelaxNGValidateAttribute(email): 0
xmlRelaxNGValidateAttribute(name): 0
-error detected at relaxng.c:4349
+error detected at relaxng.c:4789
xmlRelaxNGValidateDefinition(): validated card : -1
diff --git a/result/relaxng/tutor6_2_4.err b/result/relaxng/tutor6_2_4.err
index 02ace4c..fd91c10 100644
--- a/result/relaxng/tutor6_2_4.err
+++ b/result/relaxng/tutor6_2_4.err
@@ -1,5 +1,5 @@
xmlRelaxNGValidateDefinition(): validated name : 0
xmlRelaxNGValidateDefinition(): validated email : 0
-error detected at relaxng.c:4341
+error detected at relaxng.c:4781
xmlRelaxNGValidateDefinition(): validated preferredFormat : -1
xmlRelaxNGValidateDefinition(): validated card : -1
diff --git a/result/relaxng/tutor6_3_1.err b/result/relaxng/tutor6_3_1.err
index bfb47f3..c11ebed 100644
--- a/result/relaxng/tutor6_3_1.err
+++ b/result/relaxng/tutor6_3_1.err
@@ -1,5 +1,5 @@
xmlRelaxNGValidateAttribute(preferredFormat): -1
xmlRelaxNGValidateAttribute(email): 0
xmlRelaxNGValidateAttribute(name): 0
-error detected at relaxng.c:4349
+error detected at relaxng.c:4789
xmlRelaxNGValidateDefinition(): validated card : -1
diff --git a/result/relaxng/tutor7_1_2.err b/result/relaxng/tutor7_1_2.err
index d31ade5..cde76cd 100644
--- a/result/relaxng/tutor7_1_2.err
+++ b/result/relaxng/tutor7_1_2.err
@@ -1,5 +1,5 @@
Unimplemented block at xmlschemastypes.c:1132
-error detected at relaxng.c:3551
-error detected at relaxng.c:4526
-error detected at relaxng.c:4341
+error detected at relaxng.c:3992
+error detected at relaxng.c:4964
+error detected at relaxng.c:4781
xmlRelaxNGValidateDefinition(): validated vector : -1
diff --git a/result/relaxng/tutor7_1_3.err b/result/relaxng/tutor7_1_3.err
index 1bb9ef0..c6d9ee5 100644
--- a/result/relaxng/tutor7_1_3.err
+++ b/result/relaxng/tutor7_1_3.err
@@ -1,6 +1,6 @@
Unimplemented block at xmlschemastypes.c:1132
Unimplemented block at xmlschemastypes.c:1132
-error detected at relaxng.c:3739
-error detected at relaxng.c:4526
-error detected at relaxng.c:4341
+error detected at relaxng.c:4180
+error detected at relaxng.c:4964
+error detected at relaxng.c:4781
xmlRelaxNGValidateDefinition(): validated vector : -1
diff --git a/result/relaxng/tutor7_2_4.err b/result/relaxng/tutor7_2_4.err
index aa5e8ae..6310d77 100644
--- a/result/relaxng/tutor7_2_4.err
+++ b/result/relaxng/tutor7_2_4.err
@@ -1,3 +1,3 @@
-error detected at relaxng.c:3714
-error detected at relaxng.c:4526
+error detected at relaxng.c:4155
+error detected at relaxng.c:4964
xmlRelaxNGValidateDefinition(): validated vector : -1
diff --git a/result/relaxng/tutor7_3_4.err b/result/relaxng/tutor7_3_4.err
index 880a609..74bd68f 100644
--- a/result/relaxng/tutor7_3_4.err
+++ b/result/relaxng/tutor7_3_4.err
@@ -1,7 +1,7 @@
Unimplemented block at xmlschemastypes.c:1135
Unimplemented block at xmlschemastypes.c:1135
Unimplemented block at xmlschemastypes.c:1135
-error detected at relaxng.c:3739
-error detected at relaxng.c:4526
-error detected at relaxng.c:4341
+error detected at relaxng.c:4180
+error detected at relaxng.c:4964
+error detected at relaxng.c:4781
xmlRelaxNGValidateDefinition(): validated path : -1
diff --git a/result/relaxng/tutor7_3_5.err b/result/relaxng/tutor7_3_5.err
index b49a8a5..d8657f5 100644
--- a/result/relaxng/tutor7_3_5.err
+++ b/result/relaxng/tutor7_3_5.err
@@ -1,5 +1,5 @@
Unimplemented block at xmlschemastypes.c:1135
-error detected at relaxng.c:3551
-error detected at relaxng.c:4526
-error detected at relaxng.c:4341
+error detected at relaxng.c:3992
+error detected at relaxng.c:4964
+error detected at relaxng.c:4781
xmlRelaxNGValidateDefinition(): validated path : -1
diff --git a/result/relaxng/tutor8_2_4.err b/result/relaxng/tutor8_2_4.err
index bfce578..0af92c6 100644
--- a/result/relaxng/tutor8_2_4.err
+++ b/result/relaxng/tutor8_2_4.err
@@ -3,5 +3,5 @@
6 groups
xmlRelaxNGValidateDefinition(): validated title : 0
xmlRelaxNGValidateDefinition(): validated title : 0
-error detected at relaxng.c:4341
+error detected at relaxng.c:4781
xmlRelaxNGValidateDefinition(): validated head : -1
diff --git a/result/relaxng/tutor8_2_5.err b/result/relaxng/tutor8_2_5.err
index 4080909..516916b 100644
--- a/result/relaxng/tutor8_2_5.err
+++ b/result/relaxng/tutor8_2_5.err
@@ -1,6 +1,6 @@
xmlRelaxNGComputeInterleaves(interleave0)
6 child
6 groups
-error detected at relaxng.c:4287
-error detected at relaxng.c:4341
+error detected at relaxng.c:4727
+error detected at relaxng.c:4781
xmlRelaxNGValidateDefinition(): validated head : -1
diff --git a/result/relaxng/tutor8_2_6.err b/result/relaxng/tutor8_2_6.err
index 2632bfd..871a5d5 100644
--- a/result/relaxng/tutor8_2_6.err
+++ b/result/relaxng/tutor8_2_6.err
@@ -4,5 +4,5 @@
xmlRelaxNGValidateDefinition(): validated title : 0
xmlRelaxNGValidateDefinition(): validated base : 0
xmlRelaxNGValidateDefinition(): validated base : 0
-error detected at relaxng.c:4341
+error detected at relaxng.c:4781
xmlRelaxNGValidateDefinition(): validated head : -1
diff --git a/result/relaxng/tutor9_10_1 b/result/relaxng/tutor9_10_1
new file mode 100644
index 0000000..7c6117f
--- /dev/null
+++ b/result/relaxng/tutor9_10_1
@@ -0,0 +1 @@
+./test/relaxng/tutor9_10_1.xml validates
diff --git a/result/relaxng/tutor9_10_1.err b/result/relaxng/tutor9_10_1.err
new file mode 100644
index 0000000..a9b23d3
--- /dev/null
+++ b/result/relaxng/tutor9_10_1.err
@@ -0,0 +1,6 @@
+xmlRelaxNGCheckCombine(): merging inline.extra defines: 1
+xmlRelaxNGValidateDefinition(): validated italic : 0
+xmlRelaxNGValidateDefinition(): validated em : 0
+xmlRelaxNGValidateDefinition(): validated bold : 0
+xmlRelaxNGValidateDefinition(): validated p : 0
+xmlRelaxNGValidateDefinition(): validated doc : 0
diff --git a/result/relaxng/tutor9_11_1 b/result/relaxng/tutor9_11_1
new file mode 100644
index 0000000..02a1f2a
--- /dev/null
+++ b/result/relaxng/tutor9_11_1
@@ -0,0 +1 @@
+./test/relaxng/tutor9_11_1.xml validates
diff --git a/result/relaxng/tutor9_11_1.err b/result/relaxng/tutor9_11_1.err
new file mode 100644
index 0000000..a06deb4
--- /dev/null
+++ b/result/relaxng/tutor9_11_1.err
@@ -0,0 +1,4 @@
+xmlRelaxNGValidateDefinition(): validated name : 0
+xmlRelaxNGValidateDefinition(): validated emailAddress : 0
+xmlRelaxNGValidateDefinition(): validated card : 0
+xmlRelaxNGValidateDefinition(): validated addressBook : 0
diff --git a/result/relaxng/tutor9_12_1 b/result/relaxng/tutor9_12_1
new file mode 100644
index 0000000..08f2a8a
--- /dev/null
+++ b/result/relaxng/tutor9_12_1
@@ -0,0 +1 @@
+./test/relaxng/tutor9_12_1.xml validates
diff --git a/result/relaxng/tutor9_12_1.err b/result/relaxng/tutor9_12_1.err
new file mode 100644
index 0000000..a06deb4
--- /dev/null
+++ b/result/relaxng/tutor9_12_1.err
@@ -0,0 +1,4 @@
+xmlRelaxNGValidateDefinition(): validated name : 0
+xmlRelaxNGValidateDefinition(): validated emailAddress : 0
+xmlRelaxNGValidateDefinition(): validated card : 0
+xmlRelaxNGValidateDefinition(): validated addressBook : 0
diff --git a/result/relaxng/tutor9_5_2.err b/result/relaxng/tutor9_5_2.err
index 2bdc72e..95c7ecd 100644
--- a/result/relaxng/tutor9_5_2.err
+++ b/result/relaxng/tutor9_5_2.err
@@ -5,5 +5,5 @@
xmlRelaxNGValidateAttribute(name): 0
xmlRelaxNGValidateAttribute(email): -1
xmlRelaxNGValidateDefinition(): validated card : -1
-error detected at relaxng.c:4341
+error detected at relaxng.c:4781
xmlRelaxNGValidateDefinition(): validated addressBook : -1
diff --git a/result/relaxng/tutor9_5_3.err b/result/relaxng/tutor9_5_3.err
index 7aeb8b1..fdd483a 100644
--- a/result/relaxng/tutor9_5_3.err
+++ b/result/relaxng/tutor9_5_3.err
@@ -5,5 +5,5 @@
xmlRelaxNGValidateAttribute(name): 0
xmlRelaxNGValidateAttribute(email): 0
xmlRelaxNGValidateDefinition(): validated card : -1
-error detected at relaxng.c:4341
+error detected at relaxng.c:4781
xmlRelaxNGValidateDefinition(): validated addressBook : -1
diff --git a/result/relaxng/tutor9_6_2.err b/result/relaxng/tutor9_6_2.err
index bc1478c..3c5fd73 100644
--- a/result/relaxng/tutor9_6_2.err
+++ b/result/relaxng/tutor9_6_2.err
@@ -1,5 +1,5 @@
xmlRelaxNGValidateAttribute(name): 0
xmlRelaxNGValidateAttribute(email): -1
xmlRelaxNGValidateDefinition(): validated card : -1
-error detected at relaxng.c:4341
+error detected at relaxng.c:4781
xmlRelaxNGValidateDefinition(): validated addressBook : -1
diff --git a/result/relaxng/tutor9_6_3.err b/result/relaxng/tutor9_6_3.err
index b9bac75..3580560 100644
--- a/result/relaxng/tutor9_6_3.err
+++ b/result/relaxng/tutor9_6_3.err
@@ -1,5 +1,5 @@
xmlRelaxNGValidateAttribute(name): 0
xmlRelaxNGValidateAttribute(email): 0
xmlRelaxNGValidateDefinition(): validated card : -1
-error detected at relaxng.c:4341
+error detected at relaxng.c:4781
xmlRelaxNGValidateDefinition(): validated addressBook : -1
diff --git a/result/relaxng/tutor9_7_1 b/result/relaxng/tutor9_7_1
new file mode 100644
index 0000000..00d1502
--- /dev/null
+++ b/result/relaxng/tutor9_7_1
@@ -0,0 +1 @@
+./test/relaxng/tutor9_7_1.xml validates
diff --git a/result/relaxng/tutor9_7_1.err b/result/relaxng/tutor9_7_1.err
new file mode 100644
index 0000000..20c76cb
--- /dev/null
+++ b/result/relaxng/tutor9_7_1.err
@@ -0,0 +1,6 @@
+xmlRelaxNGCheckCombine(): merging inline.class defines: 1
+xmlRelaxNGValidateDefinition(): validated italic : 0
+xmlRelaxNGValidateDefinition(): validated em : 0
+xmlRelaxNGValidateDefinition(): validated bold : 0
+xmlRelaxNGValidateDefinition(): validated p : 0
+xmlRelaxNGValidateDefinition(): validated doc : 0
diff --git a/result/relaxng/tutor9_8_1 b/result/relaxng/tutor9_8_1
new file mode 100644
index 0000000..1849f8b
--- /dev/null
+++ b/result/relaxng/tutor9_8_1
@@ -0,0 +1 @@
+./test/relaxng/tutor9_8_1.xml validates
diff --git a/result/relaxng/tutor9_8_1.err b/result/relaxng/tutor9_8_1.err
new file mode 100644
index 0000000..20c76cb
--- /dev/null
+++ b/result/relaxng/tutor9_8_1.err
@@ -0,0 +1,6 @@
+xmlRelaxNGCheckCombine(): merging inline.class defines: 1
+xmlRelaxNGValidateDefinition(): validated italic : 0
+xmlRelaxNGValidateDefinition(): validated em : 0
+xmlRelaxNGValidateDefinition(): validated bold : 0
+xmlRelaxNGValidateDefinition(): validated p : 0
+xmlRelaxNGValidateDefinition(): validated doc : 0
diff --git a/result/relaxng/tutor9_9_1 b/result/relaxng/tutor9_9_1
new file mode 100644
index 0000000..d88f01a
--- /dev/null
+++ b/result/relaxng/tutor9_9_1
@@ -0,0 +1 @@
+./test/relaxng/tutor9_9_1.xml validates
diff --git a/result/relaxng/tutor9_9_1.err b/result/relaxng/tutor9_9_1.err
new file mode 100644
index 0000000..dc2c439
--- /dev/null
+++ b/result/relaxng/tutor9_9_1.err
@@ -0,0 +1,5 @@
+xmlRelaxNGValidateDefinition(): validated italic : 0
+xmlRelaxNGValidateDefinition(): validated em : 0
+xmlRelaxNGValidateDefinition(): validated bold : 0
+xmlRelaxNGValidateDefinition(): validated p : 0
+xmlRelaxNGValidateDefinition(): validated doc : 0
diff --git a/test/relaxng/addressBook.rng b/test/relaxng/addressBook.rng
new file mode 100644
index 0000000..3d910f9
--- /dev/null
+++ b/test/relaxng/addressBook.rng
@@ -0,0 +1,24 @@
+<grammar xmlns="http://relaxng.org/ns/structure/1.0">
+
+ <start>
+ <element name="addressBook">
+ <zeroOrMore>
+ <element name="card">
+ <ref name="cardContent"/>
+ </element>
+ </zeroOrMore>
+ </element>
+ </start>
+
+ <define name="cardContent">
+ <element name="name">
+ <text/>
+ </element>
+ <element name="email">
+ <text/>
+ </element>
+ </define>
+
+</grammar>
+
+
diff --git a/test/relaxng/inline3.rng b/test/relaxng/inline3.rng
new file mode 100644
index 0000000..72f9db6
--- /dev/null
+++ b/test/relaxng/inline3.rng
@@ -0,0 +1,22 @@
+<grammar xmlns="http://relaxng.org/ns/structure/1.0">
+
+ <define name="inline">
+ <zeroOrMore>
+ <choice>
+ <text/>
+ <element name="bold">
+ <ref name="inline"/>
+ </element>
+ <element name="italic">
+ <ref name="inline"/>
+ </element>
+ <ref name="inline.extra"/>
+ </choice>
+ </zeroOrMore>
+ </define>
+
+ <define name="inline.extra">
+ <notAllowed/>
+ </define>
+
+</grammar>
diff --git a/test/relaxng/tutor9_10.rng b/test/relaxng/tutor9_10.rng
new file mode 100644
index 0000000..c5b38db
--- /dev/null
+++ b/test/relaxng/tutor9_10.rng
@@ -0,0 +1,26 @@
+<grammar xmlns="http://relaxng.org/ns/structure/1.0">
+
+ <include href="inline3.rng"/>
+
+ <start>
+ <element name="doc">
+ <zeroOrMore>
+ <element name="p">
+ <ref name="inline"/>
+ </element>
+ </zeroOrMore>
+ </element>
+ </start>
+
+ <define name="inline.extra" combine="choice">
+ <choice>
+ <element name="code">
+ <ref name="inline"/>
+ </element>
+ <element name="em">
+ <ref name="inline"/>
+ </element>
+ </choice>
+ </define>
+
+</grammar>
diff --git a/test/relaxng/tutor9_10_1.xml b/test/relaxng/tutor9_10_1.xml
new file mode 100644
index 0000000..139a079
--- /dev/null
+++ b/test/relaxng/tutor9_10_1.xml
@@ -0,0 +1,3 @@
+<doc>
+ <p>a<bold>b<em>c<italic>d</italic>e</em>f</bold>g</p>
+</doc>
diff --git a/test/relaxng/tutor9_11.rng b/test/relaxng/tutor9_11.rng
new file mode 100644
index 0000000..cf63b02
--- /dev/null
+++ b/test/relaxng/tutor9_11.rng
@@ -0,0 +1,16 @@
+<grammar xmlns="http://relaxng.org/ns/structure/1.0">
+
+ <include href="addressBook.rng">
+
+ <define name="cardContent">
+ <element name="name">
+ <text/>
+ </element>
+ <element name="emailAddress">
+ <text/>
+ </element>
+ </define>
+
+ </include>
+
+</grammar>
diff --git a/test/relaxng/tutor9_11_1.xml b/test/relaxng/tutor9_11_1.xml
new file mode 100644
index 0000000..c542fa6
--- /dev/null
+++ b/test/relaxng/tutor9_11_1.xml
@@ -0,0 +1,3 @@
+<addressBook>
+ <card><name>foo</name><emailAddress>bar</emailAddress></card>
+</addressBook>
diff --git a/test/relaxng/tutor9_12.rng b/test/relaxng/tutor9_12.rng
new file mode 100644
index 0000000..be10b85
--- /dev/null
+++ b/test/relaxng/tutor9_12.rng
@@ -0,0 +1,22 @@
+<grammar xmlns="http://relaxng.org/ns/structure/1.0">
+
+ <start>
+ <element name="addressBook">
+ <zeroOrMore>
+ <element name="card">
+ <ref name="cardContent"/>
+ </element>
+ </zeroOrMore>
+ </element>
+ </start>
+
+ <define name="cardContent">
+ <element name="name">
+ <text/>
+ </element>
+ <element name="emailAddress">
+ <text/>
+ </element>
+ </define>
+
+</grammar>
diff --git a/test/relaxng/tutor9_12_1.xml b/test/relaxng/tutor9_12_1.xml
new file mode 100644
index 0000000..c542fa6
--- /dev/null
+++ b/test/relaxng/tutor9_12_1.xml
@@ -0,0 +1,3 @@
+<addressBook>
+ <card><name>foo</name><emailAddress>bar</emailAddress></card>
+</addressBook>
diff --git a/test/relaxng/tutor9_7_1.xml b/test/relaxng/tutor9_7_1.xml
new file mode 100644
index 0000000..139a079
--- /dev/null
+++ b/test/relaxng/tutor9_7_1.xml
@@ -0,0 +1,3 @@
+<doc>
+ <p>a<bold>b<em>c<italic>d</italic>e</em>f</bold>g</p>
+</doc>
diff --git a/test/relaxng/tutor9_8.rng b/test/relaxng/tutor9_8.rng
new file mode 100644
index 0000000..16a141d
--- /dev/null
+++ b/test/relaxng/tutor9_8.rng
@@ -0,0 +1,42 @@
+<grammar xmlns="http://relaxng.org/ns/structure/1.0">
+
+ <define name="inline">
+ <zeroOrMore>
+ <ref name="inline.class"/>
+ </zeroOrMore>
+ </define>
+
+ <define name="inline.class">
+ <choice>
+ <text/>
+ <element name="bold">
+ <ref name="inline"/>
+ </element>
+ <element name="italic">
+ <ref name="inline"/>
+ </element>
+ </choice>
+ </define>
+
+ <start>
+ <element name="doc">
+ <zeroOrMore>
+ <element name="p">
+ <ref name="inline"/>
+ </element>
+ </zeroOrMore>
+ </element>
+ </start>
+
+ <define name="inline.class" combine="choice">
+ <choice>
+ <element name="code">
+ <ref name="inline"/>
+ </element>
+ <element name="em">
+ <ref name="inline"/>
+ </element>
+ </choice>
+ </define>
+
+</grammar>
diff --git a/test/relaxng/tutor9_8_1.xml b/test/relaxng/tutor9_8_1.xml
new file mode 100644
index 0000000..139a079
--- /dev/null
+++ b/test/relaxng/tutor9_8_1.xml
@@ -0,0 +1,3 @@
+<doc>
+ <p>a<bold>b<em>c<italic>d</italic>e</em>f</bold>g</p>
+</doc>
diff --git a/test/relaxng/tutor9_9.rng b/test/relaxng/tutor9_9.rng
new file mode 100644
index 0000000..9f2e5ea
--- /dev/null
+++ b/test/relaxng/tutor9_9.rng
@@ -0,0 +1,37 @@
+<grammar xmlns="http://relaxng.org/ns/structure/1.0">
+
+ <define name="inline">
+ <zeroOrMore>
+ <ref name="inline.class"/>
+ </zeroOrMore>
+ </define>
+
+ <define name="inline.class">
+ <choice>
+ <text/>
+ <element name="bold">
+ <ref name="inline"/>
+ </element>
+ <element name="italic">
+ <ref name="inline"/>
+ </element>
+ <element name="code">
+ <ref name="inline"/>
+ </element>
+ <element name="em">
+ <ref name="inline"/>
+ </element>
+ </choice>
+ </define>
+
+ <start>
+ <element name="doc">
+ <zeroOrMore>
+ <element name="p">
+ <ref name="inline"/>
+ </element>
+ </zeroOrMore>
+ </element>
+ </start>
+
+</grammar>
diff --git a/test/relaxng/tutor9_9_1.xml b/test/relaxng/tutor9_9_1.xml
new file mode 100644
index 0000000..139a079
--- /dev/null
+++ b/test/relaxng/tutor9_9_1.xml
@@ -0,0 +1,3 @@
+<doc>
+ <p>a<bold>b<em>c<italic>d</italic>e</em>f</bold>g</p>
+</doc>