xpathを使って文字列にASCII文字しかないかどうかを調べる

このクエリに($ ASCIISupportAddressSet/ns2:Label、 '[ - 〜\ n \ t]')が含まれている場合、文字列にASCII文字しか含まれていないかどうかを確認します。しかし、私はこの疑似コードをxpathで動作させたいのです。

if (matches('АДЫГЕЙСК',[A-Z]) then
  task 1
else 
  task 2.

それが可能な場合、これに対する正しいxpath構文は何ですか?

0
@MichaelKayが指摘するように、XPath(そして一般にXML)はUnicode文字セットを使用しますが、その C0コントロールとBasic Latin ブロックはたまたまASCII文字セットの文字と一致します。あなたはそれを利用することができます。
追加された 著者 Tom Blodget,
@MichaelKayが指摘するように、XPath(そして一般にXML)はUnicode文字セットを使用しますが、その C0コントロールとBasic Latin ブロックはたまたまASCII文字セットの文字と一致します。あなたはそれを利用することができます。
追加された 著者 Tom Blodget,
あなたのxpath式を見せてください。
追加された 著者 Michael Shopsin,
ラベル要素のコンテンツにASCII以外の文字が含まれていないかどうかを確認します。以下は私が使おうとしているコードですが、うまくいきません。 contains($ ASCIISupportAddressSet/Label、 '[ - 〜\ n \ t]')ラベルの内容は以下のとおりです。 АДЫГЕЙСКАДЫГЕЙСКАДЫГЕЯРЕСПУБЛИКА
追加された 著者 anand chapla,
ラベル要素のコンテンツにASCII以外の文字が含まれていないかどうかを確認します。以下は私が使おうとしているコードですが、うまくいきません。 contains($ ASCIISupportAddressSet/Label、 '[ - 〜\ n \ t]')ラベルの内容は以下のとおりです。 АДЫГЕЙСКАДЫГЕЙСКАДЫГЕЯРЕСПУБЛИКА
追加された 著者 anand chapla,

4 答え

@MadsHansenが言うように、あなたは書くこともできます

not(matches($x, "\P{IsBasicLatin}"))

ここでの matches()呼び出しは、文字列に基本的ではないラテン文字がある場合にtrueを返します。 Unicodeブロック BasicLatin はx00からx7Fに一致します。つまり、事実上ASCIIです。

3
追加された

@MadsHansenが言うように、あなたは書くこともできます

not(matches($x, "\P{IsBasicLatin}"))

ここでの matches()呼び出しは、文字列に基本的ではないラテン文字がある場合にtrueを返します。 Unicodeブロック BasicLatin はx00からx7Fに一致します。つまり、事実上ASCIIです。

3
追加された

正規表現 [ - 〜\ n \ t] がASCII文字と一致するかどうかをテストすると、空白などのASCII文字が1つでもある場合はtrueと評価されます。あなたがあなたのコメントで述べた例の値は合格するでしょう。

値に非ASCII文字が含まれているかどうかをテストするためのいくつかの解決策:

すべての文字がASCIIの場合にのみ正規表現が一致するようにするには、最初と最後に ^ $ を追加して、適用する文字クラスを最初から最後まで固定します。正規表現。 + を追加して、その間に1から多数のASCII文字を入力します。

if ( fn:matches($ASCIISupportAddressSet/ns2:Label,'^[ -~\n\t]+$') ) ) then
  (: has ASCII characters - task 1 :)
else
  (: has non-ASCII-only characters - task 2 :)

または、元の正規表現を無効にした場合は、非ASCII文字の存在を簡単にテストできます。

if ( fn:matches($ASCIISupportAddressSet/ns2:Label,'[^ -~\n\t]') ) then
  (: has non-ASCII characters - task 2 :)
else
  (: has ASCII-only characters - task 1 :)

そしてそれから fn:not()でそれを否定することができます にしても、値にASCII文字しか含まれていない場合でもif/else呼び出しタスク1を保持します。

if ( fn:not( fn:matches($ASCIISupportAddressSet/ns2:Label,'[^ -~\n\t]') ) ) then
  (: has ASCII characters - task 1 :)
else
  (: has non-ASCII-only characters - task 2 :)
2
追加された

正規表現 [ - 〜\ n \ t] がASCII文字と一致するかどうかをテストすると、空白などのASCII文字が1つでもある場合はtrueと評価されます。あなたがあなたのコメントで述べた例の値は合格するでしょう。

値に非ASCII文字が含まれているかどうかをテストするためのいくつかの解決策:

すべての文字がASCIIの場合にのみ正規表現が一致するようにするには、最初と最後に ^ $ を追加して、適用する文字クラスを最初から最後まで固定します。正規表現。 + を追加して、その間に1から多数のASCII文字を入力します。

if ( fn:matches($ASCIISupportAddressSet/ns2:Label,'^[ -~\n\t]+$') ) ) then
  (: has ASCII characters - task 1 :)
else
  (: has non-ASCII-only characters - task 2 :)

または、元の正規表現を無効にした場合は、非ASCII文字の存在を簡単にテストできます。

if ( fn:matches($ASCIISupportAddressSet/ns2:Label,'[^ -~\n\t]') ) then
  (: has non-ASCII characters - task 2 :)
else
  (: has ASCII-only characters - task 1 :)

そしてそれから fn:not()でそれを否定することができます にしても、値にASCII文字しか含まれていない場合でもif/else呼び出しタスク1を保持します。

if ( fn:not( fn:matches($ASCIISupportAddressSet/ns2:Label,'[^ -~\n\t]') ) ) then
  (: has ASCII characters - task 1 :)
else
  (: has non-ASCII-only characters - task 2 :)
2
追加された