我正在尝试使用此查询contains($ASCIISupportAddressSet/ns2:Label,'[ -~\n\t]')
检查字符串是否只有ASCII字符。但是我希望此伪代码与xpath一起使用:
if (matches('АДЫГЕЙСК',[A-Z]) then
task 1
else
task 2.
如果可能的话,正确的xpath语法是什么?
答案 0 :(得分:3)
正如@MadsHansen所说,但您也可以写
not(matches($x, "\P{IsBasicLatin}"))
如果字符串中包含非基本拉丁字符,则此处的matches()
调用将返回true。 Unicode块BasicLatin
将x00匹配为x7F,即有效的ASCII。
答案 1 :(得分:2)
如果正好有一个ASCII字符(例如空格),则测试正则表达式[ -~\n\t]
是否与ASCII字符匹配将评估为true。您在评论中提到的示例值将通过。
用于测试值是否具有非ASCII字符的几种解决方案:
要确保仅在所有字符均为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 :)
然后您可以用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 :)