1

私の要件は次のとおりです。「ブラックリストに登録された単語を特定のXMLタグに表示しないようにする」。

XML正規表現パターンを使用してxs:restrictionを試しています。

次のリンクを参照しました:XMLスキーマの単語リストを制限します

例:ブラックリストに載っている単語:byte、bing、ding

問題:単語が同じ文字(b)で始まる場合、バイトはbing条件に渡され、その逆も同様です。

使用できるAND演算子はありますか?他にもっと簡単な方法はありますか?

前もって感謝します !!

4

5 に答える 5

2

あなたが何をしたにせよ、あなたはそれを間違えました。そして、あなたが参照したその長いスレッドを読んであなたが何をしたかを実際に理解することはできないので、あなたは私たちに言わなければならないでしょう。より良い方法があるかもしれないので、あなたが達成しようとしていることを私たちに伝えることも良い考えかもしれません。他の何よりも、世界は2009年から進んでおり、XSD1.1を使用できる可能性があります。

于 2012-06-27T17:03:51.173 に答える
0

元の質問では、禁止されている各単語を許可されているパターンのリストに変換するという、比較的簡単なものでした。ただし、この場合、結果のリストは競合するため、パターンの包括的なリストを生成するときに、すべての単語を一度に検討する必要があります。

  • bまたは以外のもので始まるd
  • で始まるb、次の文字ではないy、またはi
  • で始まりby、次の文字ではありませんt
  • で始まりbyt、次の文字ではありませんe
  • ANDで始まりbyte、少なくとももう1つの文字があります
  • bytbyまたはb
  • で始まりd、次の文字ではありませんi
  • biまたはで始まりdi、次の文字はn
  • binまたはで始まりdin、次の文字はg
  • bingまたはで始まりding、少なくとももう1つの文字があります
  • bin、、、、、またはbi_ b_ din_did

結果:

<xsd:pattern value=
  "([^bd].*|b[^yi].*|by[^t].*|byt[^e].*|byte.+|b(yt?)?|d[^i].*|[bd]i[^n].*|[bd]in[^g].*|[bd]ing.+|[bd](in?)?)"
/>

正規表現を生成するプログラムを作成することは可能かもしれませんが、それは大変な作業のように見えます。元の質問に対する答えを書いたので、私はこの問題を見ていません。@MichaelKayが言うように、その間にもっと良い解決策が生まれることを願っています。

于 2012-06-27T22:29:22.957 に答える
0

XSD 1.1では、これを行うことができます。

<xs:assert test="not(tokenize($value, '\s+') = ('byte', 'bing', 'ding'))"/>

XSD 1.1は現在、SaxonおよびXercesでサポートされています。

于 2012-06-29T09:51:22.967 に答える
0

Michael Kayの回答によると、XSD1.1を使用してロジックを実装しました。( $ value@nameに変更する必要がありました)

手順:1。最新のXerces1.1実装jarファイルで次のコードを使用しました。

<xs:element name="random-element">
    <xs:complexType>
        <xs:attribute name="name" use="required" type="xs:string" />
        <xs:attribute name="value" use="optional" type="xs:string" />
        <xs:assert test="not(tokenize(@name, '\s+') = ('byte', 'bing', 'ding'))"/>
    </xs:complexType>
</xs:element>

3.次のコードを使用して検証されます。

 final SchemaFactory schemaFactory = SchemaFactory.newInstance(Constants.W3C_XML_SCHEMA11_NS_URI);
 final Schema schema = schemaFactory.newSchema(schemaFile);
 final Validator validator = schema.newValidator();
 validator.validate(xmlFile);

定数W3C_XML_SCHEMA11_NS_URIは非常に重要です。そうでない場合、失敗します。

于 2012-07-13T14:21:37.230 に答える
0

XSD 1.1は、可能であればおそらく進むべき道です。他の答えはすでにこれをカバーしていて、私はそれらを信頼する傾向があります:-)

XSD 1.0では、否定をスタックする唯一の方法は、xs:pattern否定されたセットを使用して制限条件を繰り返すことです。たとえば、次のようになります。

<xs:pattern value="([^(byte)]" />
<xs:pattern value="([^(bing)])" />
<xs:pattern value="([^(ding)])" />

単語ごと、文字ごとなど、さらに大文字を指定することもできます。

あなたが「ブラックリストに載せている」すべてを否定する限り、あなたは比較的読みやすいパターンからそれを構築することができるはずです。

于 2017-05-09T13:17:27.187 に答える