cvc-pattern-valid: Value is not facet-valid with respect to pattern
A value does not match the regular expression its type requires.
cvc-pattern-valid: Value 'ab-12' is not facet-valid with respect to pattern '[A-Z]{3}-[0-9]{4}' for type 'Code'.
Why it happens
- The wrong letter case, length or separator for a code.
- Leading or trailing spaces: XML Schema patterns match the whole value, spaces included, unless the type collapses whitespace.
How to fix it
Compare the value with the pattern in the message; XML Schema patterns are anchored, so the whole value has to match. Xerces follows this message with cvc-type.3.1.3 naming the element.
Java's schema validation (javax.xml.validation.Validator, and JAXB or Spring on top of it) throws at the first error unless you set an ErrorHandler whose error() records the SAXParseException and carries on; each one has getLineNumber() and getColumnNumber(). A well-formedness error ends parsing whatever the handler does.
The same problem in xmlvalid
xmlvalid validates with libxml2, which reports it as [facet 'pattern'] The value is not accepted by the pattern. It checks the whole document in your browser and lists every schema error with its line and column, not only the first.
Element 'code': [facet 'pattern'] The value 'ab-12' is not accepted by the pattern '[A-Z]{3}-[0-9]{4}'.
Example
Validated against order.xsd, below.
<order currency="EUR">
<id>A-1</id>
<qty>1</qty>
<code>ab-12</code>
</order>
<order currency="EUR">
<id>A-1</id>
<qty>1</qty>
<code>ABC-0012</code>
</order>
order.xsd
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="order">
<xs:complexType>
<xs:sequence>
<xs:element name="id" type="xs:string"/>
<xs:element name="qty" type="xs:int"/>
<xs:element name="status" type="Status" minOccurs="0"/>
<xs:element name="code" type="Code" minOccurs="0"/>
<xs:element name="note" type="Short" minOccurs="0"/>
</xs:sequence>
<xs:attribute name="currency" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
<xs:simpleType name="Status">
<xs:restriction base="xs:string">
<xs:enumeration value="open"/>
<xs:enumeration value="paid"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="Code">
<xs:restriction base="xs:string">
<xs:pattern value="[A-Z]{3}-[0-9]{4}"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="Short">
<xs:restriction base="xs:string">
<xs:maxLength value="10"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>