2009-05-01 15 views
4

私はXMLスキーマを作成しており、要素のテキストが特定の値と一致しないようにする必要があります。 (例えば、variableName要素は 'int'、 'byte'、 'string'などと一致できません)XMLスキーマの単語リストを制限する

"^(int | byte | string)"のようなパターン要素で制限を使用しようとしましたが、成功なし。

正規表現を書式設定する方法、またはこの方法を使用する他の方法をご存知ですか?

+2

まず、すべてのキーワードの列挙を定義して反転させるなど、これは比較的簡単だと思いました。しかし、制限を逆転させる方法はないようです。正規表現に関しては、この問題は否定的な先読みのために叫ぶが、どちらもサポートされていない。私はあなたがうんざりかもしれないと思う。 –

+0

実際、スキーマがどのように構造化されているかを考えれば、これは可能ではないようです。一般に、私が扱うスキーマには、受け入れられた要素の短いリスト、または受け入れられたパターン適合があります。スキーマ構造では、達成しようとしているようなネガティブフィルタは簡単には許可されません。 – patjbs

+0

@AlanMoore私はXSDの正規表現が反転制限を有効にするとは思わない。しかし、それは複数の否定された制限を許し、XMLスキーマ1.0の仕様自体は、すべてのパターンを同じコンテンツモデル上に強制するだけです。 – Michael

答えて

6

XMLスキーマ(XSD)は本当には(特に先読みとアンカー)このタスクが簡単になるだろう機能のいずれかをサポートしていないが正規表現というトリプルチェックした後、私がいるようだなアプローチを作ってみました作業。フリースペースモードを使用して読みやすくしましたが、XSDフレーバーがサポートしていないもう1つの機能です。

[^ibs].* | 
    i(.{0,1} | [^n].* | n[^t].* | nt.+) | 
    b(.{0,2} | [^y].* | y[^t].* | yt[^e].* | yte.+) | 
    s(.{0,4} | [^t].* | t[^r].* | tr[^i].* | tri[^n].* | trin[^g].* | tring.+) 

最初の選択肢は、いずれのキーワードの最初の文字で始まらないものにもマッチします。

  • がキーワードよりも短くなって、
  • は異なる第二の手紙を持って、別の第三の手紙、等:他のトップレベルの選択肢は、それぞれのキーワードのいずれかが、同じ文字で始まる文字列にマッチします。、または
  • がキーワードより長いです。

XSDの正規表現は、明示的なアンカー(すなわち、^$\A\z)をサポートしていないが、すべてのマッチが暗黙的に両端で固定されていることに留意されたいです。

考えられる1つの問題:キーワードのリストが長い場合は、正規表現の完全な長さの制限に対して実行する可能性があります。

+0

うわー、これを考えてくれてありがとう。それは長いですが、それはすごくうまくいきます。 – andypaxo

0

否定的な先読みなしでは、これはかなり面倒です。添付されているいくつかのユニットテストで動作する正規表現です。これはPerlではなくXSDで書かれていますが、それはかなり基本的な正規表現ですので、動作するはずです...正規表現から空白を削除してから使用してください。空白を追加して読みやすくしました。

注:「\ A」と「\ z」がXSDで許可されているかどうかはわかりません。そうでない場合は、それぞれ "^"と "$"に置き換えてください。

use Test::More 'no_plan'; 

my $re = qr/\A(\z|[^ibs]               
    |i(\z|[^n]|n(\z|[^t]|t.))              
    |b(\z|[^y]|y(\z|[^t]|t(\z|[^e]|e.)))           
    |s(\z|[^t]|t(\z|[^r]|r(\z|[^i]|i(\z|[^n]|n(\z|[^g]|g.))))))/x; 

for my $str (qw(inter bytes ins str strings in sdgsdfger i b s by byt bite st \ 
str stri strin strink)) { 
    like($str, $re, $str); 
} 

for my $str (qw(int byte string)) { 
    unlike($str, $re, $str); 
} 
1

それはW3Cのスキーマ(別名 "XMLスキーマ")でなければなりませんか?あるいは、RelaxNGのような標準的な代替案がありますか?私は間違っているかもしれませんが、私は交差点を行う能力を含む制限を組み合わせることにいくつかの犠牲があったと思いました。

+0

このスキーマは、すでにW3Cスキーマを使用し、この標準のサポートを含むシステムの一部です。そう、はい、私はW3Cでなければならないと思います。 – andypaxo

関連する問題