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 @@ +