使用xpath检查字符串是否只有ASCII字符

使用xpath检查字符串是否只有ASCII字符,xpath,ascii,xquery,Xpath,Ascii,Xquery,我试图使用此查询检查字符串是否只有ASCII字符包含($ASCIISupportAddressSet/ns2:Label,[-~\n\t]')。但是,我希望此伪代码与xpath配合使用: if (matches('АДЫГЕЙСК',[A-Z]) then task 1 else task 2. 如果可能的话,正确的xpath语法是什么?如果恰好有一个ASCII字符(如空格),则测试正则表达式是否匹配ASCII字符将计算为true。您在评论中提到的示例值将通过 测试值是否具有非ASC

我试图使用此查询检查字符串是否只有ASCII字符
包含($ASCIISupportAddressSet/ns2:Label,[-~\n\t]')
。但是,我希望此伪代码与xpath配合使用:

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

如果可能的话,正确的xpath语法是什么?

如果恰好有一个ASCII字符(如空格),则测试正则表达式是否匹配ASCII字符将计算为true。您在评论中提到的示例值将通过

测试值是否具有非ASCII字符的两种解决方案:

if ( fn:not( fn:matches($ASCIISupportAddressSet/ns2:Label,'[^ -~\n\t]') ) ) then
  (: has ASCII characters - task 1 :)
else
  (: has non-ASCII-only characters - task 2 :)
若要确保正则表达式仅在所有字符均为ASCII时匹配,请通过在正则表达式的开头和结尾添加
^
$
确保从头到尾锚定字符类的应用,并添加
+
以要求在两者之间包含一对多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 :)
然后,如果值只有ASCII字符,则可以使用否定,并且仍然保留调用任务1的if/else:

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

正如@MadsHansen所说,但你也可以写作

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

如果字符串中有非基本拉丁字符,则此处的
matches()
调用将返回true。Unicode块
BasicLatin
匹配x00到x7F,这实际上是ASCII。

请显示您的xpath表达式。我正在尝试检查标签元素内容是否包含任何非ASCII字符。下面是我试图使用的代码,但它不起作用。包含($ASCISupportAddressSet/Label,[-~\n\t]”)Label具有以下内容。正如@MichaelKay指出的,尽管XPath(以及一般的XML)使用Unicode字符集,但其块恰好与ASCII字符集中的字符一致。您可以利用它。@krzysztofcichochoki上面的'\P'表示否定,在xsl中使用它完全可以。正确的答案将是迈克尔给出的第一个答案。请参阅文档:。