diff --git a/jsonschema-core.xml b/jsonschema-core.xml
index 49df09c2..6c7c9ccf 100644
--- a/jsonschema-core.xml
+++ b/jsonschema-core.xml
@@ -2085,7 +2085,8 @@
"items", whose behavior is defined in terms of "prefixItems"
- "contains", whose behavior is defined in terms of "minContains"
+ "contains", whose behavior is affected by the presence and value of
+ "minContains", in the Validation vocabulary
@@ -2318,6 +2319,8 @@
positions within the instance array, it produces an
annotation result of boolean true, indicating that all remaining array
elements have been evaluated against this keyword's subschema.
+ This annotation affects the behavior of "unevaluatedItems" in the
+ Unevaluated vocabulary.
Omitting this keyword has the same assertion behavior as
@@ -2337,15 +2340,10 @@
An array instance is valid against "contains" if at least one of
- its elements is valid against the given schema. The subschema MUST be
- applied to every array element even after the first match has
- been found, in order to collect annotations for use by other keywords.
- This is to ensure that all possible annotations are collected.
-
-
- Logically, the validation result of applying the value subschema to each
- item in the array MUST be ORed with "false", resulting in an overall
- validation result.
+ its elements is valid against the given schema,
+ except when "minContains" is present and has a value of 0, in which
+ case an array instance MUST be considered valid against the "contains" keyword,
+ even if none of its elements is valid against the given schema.
This keyword produces an annotation value which is an array of
@@ -2355,6 +2353,16 @@
instance. The annotation MUST be present if the instance array to which
this keyword's schema applies is empty.
+
+ This annotation affects the behavior of "unevaluatedItems" in the
+ Unevaluated vocabulary, and MAY also be used to implement the
+ "minContains" and "maxContains" keywords in the Validation vocabulary.
+
+
+ The subschema MUST be applied to every array element even after the first
+ match has been found, in order to collect annotations for use by other
+ keywords. This is to ensure that all possible annotations are collected.
+
@@ -2373,6 +2381,8 @@
The annotation result of this keyword is the set of instance
property names matched by this keyword.
+ This annotation affects the behavior of "additionalProperties" (in
+ this vocabulary) and "unevaluatedProperties" in the Unevaluated vocabulary.
Omitting this keyword has the same assertion behavior as
@@ -2396,6 +2406,8 @@
The annotation result of this keyword is the set of instance
property names matched by this keyword.
+ This annotation affects the behavior of "additionalProperties" (in this
+ vocabulary) and "unevaluatedProperties" (in the Unevaluated vocabulary).
Omitting this keyword has the same assertion behavior as
@@ -2422,6 +2434,8 @@
The annotation result of this keyword is the set of instance
property names validated by this keyword's subschema.
+ This annotation affects the behavior of "unevaluatedProperties"
+ in the Unevaluated vocabulary.
Omitting this keyword has the same assertion behavior as
@@ -2552,6 +2566,7 @@
positions within the instance array, it produces an
annotation result of boolean true, analogous to the
behavior of "items".
+ This annotation affects the behavior of "unevaluatedItems" in parent schemas.
Omitting this keyword has the same assertion behavior as
@@ -2595,6 +2610,7 @@
The annotation result of this keyword is the set of instance
property names validated by this keyword's subschema.
+ This annotation affects the behavior of "unevaluatedProperties" in parent schemas.
Omitting this keyword has the same assertion behavior as
@@ -3839,8 +3855,8 @@ https://example.com/schemas/common#/$defs/count/minimum
"$schema" MAY change for embedded resources
Array-value "items" functionality is now "prefixItems"
"items" subsumes the old function of "additionalItems"
- "contains" and "unevaluatedItems" interactions now specified
- Rename $recursive* to $dynamic*
+ "contains" annotation behavior, and "contains" and "unevaluatedItems" interactions now specified
+ Rename $recursive* to $dynamic*, with behavior modification
$dynamicAnchor defines a fragment like $anchor
$dynamic* (previously $recursive) no longer use runtime base URI determination
Define Compound Schema Documents (bundle) and processing
diff --git a/jsonschema-validation.xml b/jsonschema-validation.xml
index 9abdc1de..d92a5495 100644
--- a/jsonschema-validation.xml
+++ b/jsonschema-validation.xml
@@ -442,8 +442,9 @@
A value of 0 is allowed, but is only useful for setting a range
- of occurrences from 0 to the value of "maxContains". A value of
- 0 with no "maxContains" causes "contains" to always pass validation.
+ of occurrences from 0 to the value of "maxContains". A value of
+ 0 causes "minContains" to always pass validation (but validation can
+ still fail against a "maxContains" keyword).
Omitting this keyword has the same behavior as a value of 1.
@@ -704,30 +705,34 @@
A string instance is valid against this attribute if it is
- a valid representation according to the "date-time" production.
+ a valid representation according to the "date-time' ABNF rule
+ (referenced above)
A string instance is valid against this attribute if it is
- a valid representation according to the "full-date" production.
+ a valid representation according to the "full-date" ABNF rule
+ (referenced above)
A string instance is valid against this attribute if it is
- a valid representation according to the "full-time" production.
+ a valid representation according to the "full-time" ABNF rule
+ (referenced above)
A string instance is valid against this attribute if it is
- a valid representation according to the "duration" production.
+ a valid representation according to the "duration" ABNF rule
+ (referenced above)
Implementations MAY support additional attributes using the other
- production names defined anywhere in that RFC. If "full-date" or "full-time"
+ format names defined anywhere in that RFC. If "full-date" or "full-time"
are implemented, the corresponding short form ("date" or "time"
respectively) MUST be implemented, and MUST behave identically.
Implementations SHOULD NOT define extension attributes
- with any name matching an RFC 3339 production unless it validates
- according to the rules of that production.
+ with any name matching an RFC 3339 format unless it validates
+ according to the rules of that format.
There is not currently consensus on the need for supporting
all RFC 3339 formats, so this approach of reserving the