The value of the pattern facet is a regular expression (regex) and the question mark is a reserved symbol (it is a meta-symbol). To indicate that we want the question mark (not the meta-symbol) we must escape it:
<xs:simpleType name="Test2">
<xs:restriction base="xs:string">
<xs:pattern value="A|B|\?" />
</xs:restriction>
</xs:simpleType>
With XML Schema 1.1, I sometimes prefer <xs:assertion test="matches(..)"/> over <xs:pattern value=".."/>, particularly for complex regexes. With XPath 2.0 fn:matches, we can use regex flags as defined by XPath 2.0 F&O spec (
https://www.w3.org/TR/xquery-operators/#regex-syntax), to break long regex into multiple lines for readability. For e.g, translating above cited XSD simpleType would look like following (not tested) with
xs:assertion,
<xs:simpleType name="Test2">
<xs:restriction base="xs:string">
<xs:assertion test="matches($value, 'A
| B
| \?', 'mx')" />
</xs:restriction>
</xs:simpleType>
(this can be even more helpful, when regexes are much more complex)