diff --git a/relaxng.c b/relaxng.c
index 2f13cbdd10070204abd17560c232377494b2cbc3..268c4e760703c24bd79ec86a82700bd9d1f9cd7c 100644
--- a/relaxng.c
+++ b/relaxng.c
@@ -6395,7 +6395,10 @@ xmlRelaxNGCheckRules(xmlRelaxNGParserCtxtPtr ctxt,
NULL, NULL);
}
if ((!(flags & XML_RELAXNG_IN_ONEORMORE))
- && (cur->name == NULL)) {
+ && cur->name == NULL
+ /* following is checking alternative name class readiness
+ in case it went the "choice" route */
+ && cur->nameClass == NULL) {
if (cur->ns == NULL) {
xmlRngPErr(ctxt, cur->node, XML_RNGP_ANYNAME_ATTR_ANCESTOR,
"Found anyName attribute without oneOrMore ancestor\n",
@@ -9476,7 +9479,17 @@ xmlRelaxNGValidateInterleave(xmlRelaxNGValidCtxtPtr ctxt,
xmlRelaxNGFreeValidState(ctxt, oldstate);
oldstate = ctxt->state;
ctxt->state = NULL;
- if (cur != NULL) {
+ if (cur != NULL
+ /* there's a nasty violation of context-free unambiguities,
+ since in open-name-class context, interleave in the
+ production shall finish without caring about anything
+ else that is OK to follow in that case -- it would
+ otherwise get marked as "extra content" and would
+ hence fail the validation, hence this perhaps
+ dirty attempt to rectify such a situation */
+ && (define->parent->type != XML_RELAXNG_DEF
+ || !xmlStrEqual(define->parent->name,
+ (const xmlChar *) "open-name-class"))) {
VALID_ERR2(XML_RELAXNG_ERR_INTEREXTRA, cur->name);
ret = -1;
ctxt->state = oldstate;
diff --git a/result/relaxng/ambig_name-class2_err b/result/relaxng/ambig_name-class2_err
new file mode 100644
index 0000000000000000000000000000000000000000..2c1ba8d315175c6f985971619a870eb365f76d0f
--- /dev/null
+++ b/result/relaxng/ambig_name-class2_err
@@ -0,0 +1 @@
+./test/relaxng/ambig_name-class2.rng validates
diff --git a/result/relaxng/ambig_name-class2_valid b/result/relaxng/ambig_name-class2_valid
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/result/relaxng/ambig_name-class_err b/result/relaxng/ambig_name-class_err
new file mode 100644
index 0000000000000000000000000000000000000000..0afe5cd66d1b7586b8e0fca5b11506657c9b4ba5
--- /dev/null
+++ b/result/relaxng/ambig_name-class_err
@@ -0,0 +1 @@
+./test/relaxng/ambig_name-class.rng validates
diff --git a/result/relaxng/ambig_name-class_valid b/result/relaxng/ambig_name-class_valid
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/test/relaxng/ambig_name-class.rng b/test/relaxng/ambig_name-class.rng
new file mode 120000
index 0000000000000000000000000000000000000000..08533d396b0e9d408623c4c9fb4ab274b7e1edcc
--- /dev/null
+++ b/test/relaxng/ambig_name-class.rng
@@ -0,0 +1 @@
+tutorA.rng
\ No newline at end of file
diff --git a/test/relaxng/ambig_name-class.xml b/test/relaxng/ambig_name-class.xml
new file mode 100644
index 0000000000000000000000000000000000000000..de673f2e48a8d089e8c753d86b319ba389bff44f
--- /dev/null
+++ b/test/relaxng/ambig_name-class.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ alpha
+ bravo
+
+
+ none
+ all
+
+
+
+
+
diff --git a/test/relaxng/ambig_name-class2.rng b/test/relaxng/ambig_name-class2.rng
new file mode 120000
index 0000000000000000000000000000000000000000..6cc955c1aa4c7baf048bc93812320932c32623e5
--- /dev/null
+++ b/test/relaxng/ambig_name-class2.rng
@@ -0,0 +1 @@
+ambig_name-class.xml
\ No newline at end of file
diff --git a/test/relaxng/ambig_name-class2.xml b/test/relaxng/ambig_name-class2.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3c1e4e2582826bdcfc939c57e02225392715ffed
--- /dev/null
+++ b/test/relaxng/ambig_name-class2.xml
@@ -0,0 +1 @@
+