An identity constraint's selector and field xpath must be in the XSD 1.0 restricted-XPath subset (Part 1, 3.11.6), far narrower than full XPath: a leading optional .//, then /-separated steps, a step being '.', a name test (QName, '*', or NCName:*), or a child:: axis; a field path may end in an attribute step (@x or attribute::x). No predicates, no other axes, no absolute or interior //. The xpath was stored raw and compiled lazily with try?, so a malformed one was silently accepted. It is now lexed into a whitespace-tolerant token stream and parsed against the grammar: whitespace between tokens is allowed (child :: a, . //.) while // must be adjacent and a name test's own ':' may not be spaced. The name lexer uses the XML NameChar set so a non-ASCII NCName is accepted. The two identity tests that fed a malformed xpath and expected a validation-time located error now assert the stronger compile-time rejection. XSTS: invalid schemas accepted 785 to 736, valid schemas rejected held at 72, instance buckets unchanged. |
||
|---|---|---|
| .. | ||
| rules | ||
| benchmarks.md | ||
| schema-validity-burndown.md | ||
| xsts-deviations.md | ||