後はこの辺りを参考にxsd:patternを書いてゆこう。でもRELAX NG Compact Syntaxを見るとxsd:string { xsd:pattern="[1-9][0-9]*" }
とかはエラーっぽい。制約ファセット名="値" の制約ファセット名は NCName または "\" NCNameになっているし。RELAX NG Compact Syntax Tutorialを見るとxsd:接頭辞は要らないみたいだが
。
その前にだ。libxml2が正規表現によるファセットを実装してくれているかを確認しなければ。テスト用の文書を作成。
まず次のようなCompact Syntaxなスキーマを書いて、TrangでXML構文のものに変換:
default namespace = "http://www.example.com/"
datatypes xsd = "http://www.w3.org/2001/XMLSchema-datatypes"
Length.datatype =
xsd:nonNegativeInteger
| xsd:token { pattern="\d+[%]|\d*\.\d+[%]" }
MultiLength.datatype =
Length.datatype
| xsd:token { pattern="\d*\*" }
Color.datatype =
xsd:NMTOKEN
| xsd:token { pattern="#[0-9a-fA-F]{6}" }
status.attrib = attribute status { "invalid" }
start = Root
Root = element Root {
element Length { status.attrib?, Length.datatype }*
& element MultiLength { status.attrib?, MultiLength.datatype }*
& element Color{ status.attrib?, Color.datatype }*
}
検証用のXMLを作成:
<?xml version="1.0" encoding="UTF-8"?>
<Root xmlns="http://www.example.com/">
<Length status="invalid">invalid data</Length>
<Length>25%</Length>
<Length>.8%</Length>
<Length>12</Length>
<Length status="invalid">12.5</Length>
<MultiLength>25%</MultiLength>
<MultiLength>25*</MultiLength>
<MultiLength>*</MultiLength>
<MultiLength status="invalid">*25</MultiLength>
<Color>#FF0099</Color>
<Color>red</Color>
<Color status="invalid">blue green</Color>
</Root>
で、結果はというと、このテストは完璧にクリアしてくれた。やるなlibxml2。ただエラーメッセージが貧弱すぎるけれど。