Quantifying

Despite an apparent similarity, the xs:pattern facet interprets its value attribute in a very different way than xs:enumeration does. xs:enumeration reads the value as a lexical representation, and converts it to the corresponding value for its base datatype, while xs:pattern reads the value as a set of conditions to apply on lexical values. When we write:

<xs:pattern value="15"/>

we specify three conditions (first character equals “1,” second character equals “5,” and the string must finish after this). Each of the matching conditions (such as first character equals “1” and second character equals “5”) is called a piece. This is just the simplest form to specify a piece.

Each piece in a pattern is composed of an atom identifying a character, or a set of characters, and an optional quantifier. Characters (except special characters that must be escaped) are the simplest form of atoms. In our example, we have omitted the quantifiers. Quantifiers may be defined using two different syntaxes: either a special character (* for 0 or more, + for one or more, and ? for 0 or 1) or a numeric range within curly braces ({n} for exactly n times, {n,m} for between n and m times, or {n,} for n or more times).

Using these quantifiers, we can merge our three patterns into one:

<xs:simpleType name="myByte">
  <xs:restriction base="xs:byte">
    <xs:pattern value="1?5?"/>
  </xs:restriction>
</xs:simpleType>

This new pattern means there must be zero or one character (“1”) followed by zero or one character (“5”). This is not exactly the same meaning as our three previous patterns since the empty string “” is now accepted by the pattern. However, since the empty string doesn’t belong to the lexical space of our base type ( xs:byte ), the new datatype has the same lexical space as the previous one.

We could also use quantifiers to limit the number of leading zeros—for instance, the following pattern limits the number of leading zeros to up to 2:

<xs:simpleType name="myByte">
  <xs:restriction base="xs:byte">
    <xs:pattern value="0{0,2}1?5?"/>
  </xs:restriction>
</xs:simpleType>