cvc-datatype-valid: hodnota neodpovídá typu XSD

Hodnota elementu nebo atributu neodpovídá datovému typu ve schématu: má nesprávný zápis (12,50 v xs:decimal), nevyhoví vzoru, není ve výčtu nebo je mimo rozsah. Java (Xerces) hlásí cvc-datatype-valid.1.2.1, cvc-pattern-valid, cvc-enumeration-valid nebo cvc-maxInclusive-valid a za nimi cvc-type.3.1.3. libxml2 (PHP, xmllint) píše is not a valid value of the atomic type nebo [facet 'pattern'].

Autor: Aktualizováno

Znění hlášky v jednotlivých validátorech

Parser Hláška Kdy
libxml2 2.13 a novější PHP (DOM, SimpleXML), xmllint, Python lxml, validátor na XML.cz Element 'cena': '12,50' is not a valid value of the atomic type 'xs:decimal'. Desetinná čárka v xs:decimal
Element 'kod': [facet 'pattern'] The value 'cz001' is not accepted by the pattern '[A-Z]{2}[0-9]{3}'. Hodnota neodpovídá vzoru (pattern)
Element 'mena': [facet 'enumeration'] The value 'Kč' is not an element of the set {'CZK', 'EUR'}. Hodnota není ve výčtu (enumeration)
Element 'pocet': [facet 'maxInclusive'] The value '150' is greater than the maximum value allowed ('100'). Číslo mimo povolený rozsah (maxInclusive)
Java (Xerces) DocumentBuilder, SAXParser, JAXB, Spring, Maven cvc-datatype-valid.1.2.1: '12,50' is not a valid value for 'decimal'. Desetinná čárka v xs:decimal
cvc-pattern-valid: Value 'cz001' is not facet-valid with respect to pattern '[A-Z]{2}[0-9]{3}' for type '#AnonType_kodpolozka'. Hodnota neodpovídá vzoru (pattern)
cvc-enumeration-valid: Value 'Kč' is not facet-valid with respect to enumeration '[CZK, EUR]'. It must be a value from the enumeration. Hodnota není ve výčtu (enumeration)
cvc-maxInclusive-valid: Value '150' is not facet-valid with respect to maxInclusive '100' for type '#AnonType_pocetpolozka'. Číslo mimo povolený rozsah (maxInclusive)
.NET XmlDocument, XDocument, XmlReader The 'cena' element is invalid - The value '12,50' is invalid according to its datatype 'http://www.w3.org/2001/XMLSchema:decimal' - The string '12,50' is not a valid Decimal value. Desetinná čárka v xs:decimal
The 'kod' element is invalid - The value 'cz001' is invalid according to its datatype 'String' - The Pattern constraint failed. Hodnota neodpovídá vzoru (pattern)
The 'mena' element is invalid - The value 'Kč' is invalid according to its datatype 'String' - The Enumeration constraint failed. Hodnota není ve výčtu (enumeration)
The 'pocet' element is invalid - The value '150' is invalid according to its datatype 'Integer' - The MaxInclusive constraint failed. Číslo mimo povolený rozsah (maxInclusive)

Java s vlastním ErrorHandler vypíše ke každé hodnotě dvě chyby. První (cvc-datatype-valid, cvc-pattern-valid …) říká, které pravidlo hodnota porušila, druhá (cvc-type.3.1.3: The value '…' of element '…' is not valid) jmenuje element. Bez ErrorHandler skončí validace výjimkou s první z nich.

Příčiny a opravy

XSD pro desetinné číslo
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="cena" type="xs:decimal"/>
</xs:schema>

Desetinná čárka v xs:decimal

Chybně
<cena>12,50</cena>
Opraveno
<cena>12.50</cena>

xs:decimal používá desetinnou tečku bez ohledu na jazyk uživatele. Formátuj čísla pro datový přenos nezávisle na českém formátu. Neopravuj dokument plošným nahrazením čárek, které mohou patřit do textu.

XSD s omezeními (pattern, enumeration, rozsah)
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="polozka">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="kod">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:pattern value="[A-Z]{2}[0-9]{3}"/>
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
        <xs:element name="mena">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:enumeration value="CZK"/>
              <xs:enumeration value="EUR"/>
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
        <xs:element name="pocet">
          <xs:simpleType>
            <xs:restriction base="xs:integer">
              <xs:minInclusive value="1"/>
              <xs:maxInclusive value="100"/>
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Hodnota neodpovídá vzoru (pattern)

Chybně
<polozka>
  <kod>cz001</kod>
  <mena>CZK</mena>
  <pocet>2</pocet>
</polozka>
Opraveno
<polozka>
  <kod>CZ001</kod>
  <mena>CZK</mena>
  <pocet>2</pocet>
</polozka>

Vzor v XSD platí vždy pro celou hodnotu, nemusí začínat ^ ani končit $. Rozlišuje velká a malá písmena.

Hodnota není ve výčtu (enumeration)

Chybně
<polozka>
  <kod>CZ001</kod>
  <mena>Kč</mena>
  <pocet>2</pocet>
</polozka>
Opraveno
<polozka>
  <kod>CZ001</kod>
  <mena>CZK</mena>
  <pocet>2</pocet>
</polozka>

Výčet porovnává hodnotu přesně. Kč, czk i CZK s mezerou jsou pro něj jiné hodnoty než CZK.

Číslo mimo povolený rozsah (maxInclusive)

Chybně
<polozka>
  <kod>CZ001</kod>
  <mena>CZK</mena>
  <pocet>150</pocet>
</polozka>
Opraveno
<polozka>
  <kod>CZ001</kod>
  <mena>CZK</mena>
  <pocet>2</pocet>
</polozka>

Hodnota má správný zápis celého čísla, ale je mimo rozsah daný minInclusive a maxInclusive.

Zápis hodnoty a její povolený rozsah

Nejdřív ověř základní typ a potom jeho omezení. Hodnota 12.50 vyhoví xs:decimal, ale nemusí vyhovět vlastnímu typu s maximem 10. Naopak 12,50 nesplní už samotný zápis desetinného čísla.

Při opravě porovnej skutečnou hodnotu s restriction ve schématu. Pokud validátor používá jinou verzi XSD než příjemce, lokální úspěch nemusí odpovídat jeho výsledku. Typy a omezení vysvětluje XML Schema, přehled typů je v referenci datových typů XSD.