制約ファセットに pattern ファセットがあります。
これは正規表現を扱う制約ファセットなのですが、非常に強力です。
XML は所詮テキストなので、正規表現が利用できるとかなり便利なのは想像に難くないですね。
一般的な正規表現については割愛します。
ここでは、あまりなじみのない特殊な正規表現を紹介します。
【Unicode のカテゴリーで指定する】
\p{カテゴリー名} で指定されたカテゴリーに所属する文字を、\P{カテゴリー名} で指定されたカテゴリーに所属しない文字を指定することができます。
例えば、\p{Lu} なら大文字アルファベット、\p{Nd} なら数字、\P{Ll} なら小文字アルファベット以外の文字といった具合です。
【Unicode のブロックで指定する】
\p{Isブロック名} で指定されたブロックに所属する文字を、\P{Isブロック名} で指定されたブロックに所属しない文字を指定することができます。
\p{IsGreek} ならギリシャ語、\p{IsHiragana} ならひらがな、\P{IsKatakana} ならカタカナ以外の文字といった具合です。
詳しくは
http://www.unicode.org/charts/ で確認してみてください。
【文字クラスの減算】
様々な文字クラスを集合の減算のように扱えます。
[\p{Nd}-[0]] で 0 以外の数字、[\p{IsBasicLatin}-[\p{Nd}]] で BasicLatin ブロックから数字を除いたものを指定できます。
そして、これらは .NET Framework の System.Text.RegularExpressions.Regex クラスでも利用できます。
\p{IsHiragana}, \p{IsKatakana} あたりは、入力値のバリデートに利用できそうですね。
文字クラスの減算はできないと思ってたんですが、どうやら .NET 2.0 から利用できるようになったみたいですね。
// .NET 1.x
Console.WriteLine(Regex.IsMatch("hogeA", "^[\\p{IsBasicLatin}-[A]]+$")); // False
Console.WriteLine(Regex.IsMatch("hogeB", "^[\\p{IsBasicLatin}-[A]]+$")); // False
// .NET 2.0
Console.WriteLine(Regex.IsMatch("hogeA", "^[\\p{IsBasicLatin}-[A]]+$")); // False
Console.WriteLine(Regex.IsMatch("hogeB", "^[\\p{IsBasicLatin}-[A]]+$")); // True
こんなふうになりました。
ちなみに Java だと、java.util.regex パッケージでは、文字クラスの減算はできません。
また、ブロック指定もプレフィクスが Is ではなく In になります。
ですが、Xerces で XML Schema を利用する際には、どちらも利用できます。
どうも Xerces 内部の org.apache.xerces.impl.xpath.regex.RegularExpression あたりが司ってそうな感じです。
ただ、パッケージが xpath ってのが気になるところではありますが。
直接 Java ソースから利用できるかなーと思ってみたんですが、めんどくさくなってあきらめました。
ちゃんと環境設定してやればできるんじゃないかなー